-
2019-06-11 10:50:26
commonValid.validName
原本写法是上面这种写法,但是我想加个额外参数类型,
通过下面写法就可以,前三个是回调函数自带的参数
(rule, value, callback)=> commonValid.validName(rule, value, callback,"type"),
更多相关内容 -
写一个函数只要调用一次就可以将参数的值增加1
2018-02-20 00:21:49void recall(int *i) { (*i)++; } int main() { int i = 0; recall(&i); recall(&i); printf("%d\n", i); while (1) //终止条件 return 0; }void recall(int *i) { (*i)++; } int main() { int i = 0; recall(&i); recall(&i); printf("%d\n", i); while (1) //终止条件 return 0; }
-
Java获取函数参数名称的几种方法
2019-01-25 09:22:38JDK1.7及以下版本的API并不能获取到函数的参数名称,需要使用字节码处理框架,如ASM、...1、下面给出一个使用ASM获取函数参数名称的例子: import java.io.IOException; import java.io.InputStream; import j...JDK1.7及以下版本的API并不能获取到函数的参数名称,需要使用字节码处理框架,如ASM、javassist等来实现,且需要编译器开启输出调试符号信息的参数的-g,在Eclipse中就是要勾选下面的选项:
1、下面给出一个使用ASM获取函数参数名称的例子:
import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; public class TestMain { public static void main(String[] args) { Class<?> clazz = TestMain.class; try { Method method = clazz.getDeclaredMethod("test", String.class, int.class); String[] pns = getParameterNamesByAsm5(clazz, method); System.out.print(method.getName() + " : "); for (String parameterName : pns) { System.out.print(parameterName + ' '); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } } public static void test(String param1, int param2) { System.out.println(param1 + param2); } public static String[] getParameterNamesByAsm5(Class<?> clazz, final Method method) { final Class<?>[] parameterTypes = method.getParameterTypes(); if (parameterTypes == null || parameterTypes.length == 0) { return null; } final Type[] types = new Type[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; i++) { types[i] = Type.getType(parameterTypes[i]); } final String[] parameterNames = new String[parameterTypes.length]; String className = clazz.getName(); int lastDotIndex = className.lastIndexOf("."); className = className.substring(lastDotIndex + 1) + ".class"; InputStream is = clazz.getResourceAsStream(className); try { ClassReader classReader = new ClassReader(is); classReader.accept(new ClassVisitor(Opcodes.ASM5) { @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { // 只处理指定的方法 Type[] argumentTypes = Type.getArgumentTypes(desc); if (!method.getName().equals(name) || !Arrays.equals(argumentTypes, types)) { return super.visitMethod(access, name, desc, signature, exceptions); } return new MethodVisitor(Opcodes.ASM5) { @Override public void visitLocalVariable(String name, String desc, String signature, org.objectweb.asm.Label start, org.objectweb.asm.Label end, int index) { // 非静态成员方法的第一个参数是this if (Modifier.isStatic(method.getModifiers())) { parameterNames[index] = name; } else if (index > 0) { parameterNames[index - 1] = name; } } }; } }, 0); } catch (IOException e) { } finally { try { if (is != null) { is.close(); } } catch (Exception e2) { } } return parameterNames; } }
2、使用javassist获取函数参数名称的例子
import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; import javassist.NotFoundException; import javassist.bytecode.CodeAttribute; import javassist.bytecode.LocalVariableAttribute; import javassist.bytecode.MethodInfo; public class TestMain { public static void main(String[] args) { Class<?> clazz = TestMain.class; ClassPool pool = ClassPool.getDefault(); try { CtClass ctClass = pool.get(clazz.getName()); CtMethod ctMethod = ctClass.getDeclaredMethod("test"); // 使用javassist的反射方法的参数名 MethodInfo methodInfo = ctMethod.getMethodInfo(); CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute .getAttribute(LocalVariableAttribute.tag); if (attr != null) { int len = ctMethod.getParameterTypes().length; // 非静态的成员函数的第一个参数是this int pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1; System.out.print("test : "); for (int i = 0; i < len; i++) { System.out.print(attr.variableName(i + pos) + ' '); } System.out.println(); } } catch (NotFoundException e) { e.printStackTrace(); } } public static void test(String param1, int param2) { System.out.println(param1 + param2); } }
可以看见直接使用ASM和javassist来获取函数参数名称都还是比较麻烦的
3、使用spring-core中的LocalVariableTableParameterNameDiscoverer来获取函数参数名称,它对ASM进行了封装:
import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; public class TestMain { public static void main(String[] args) { ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); try { String[] parameterNames = parameterNameDiscoverer .getParameterNames(TestMain.class.getDeclaredMethod("test", String.class, int.class)); System.out.print("test : "); for (String parameterName : parameterNames) { System.out.print(parameterName + ' '); } } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } } public static void test(String param1, int param2) { System.out.println(param1 + param2); } }
4、在Java1.8之后,可以通过反射API java.lang.reflect.Executable.getParameters来获取到方法参数的元信息。这要求在使用编译器时加上-parameters参数,它会在生成的.class文件中额外存储参数的元信息,这会增加class文件的大小。
在Eclipse下默认没有使用该编译参数,需要设置
在IDEA下,你需要在
Preferences->Build,Execution,Deployment->Compiler->java Compiler
页面添加该编译选项下面给出一个使用Java8反射函数参数名称的例子:
import java.lang.reflect.Method; import java.lang.reflect.Parameter; public class TestMain { public static void main(final String[] arguments) throws Exception { Class<?> clazz = TestMain.class; Method method = clazz.getDeclaredMethod("test", String.class, int.class); System.out.print("test : "); Parameter[] parameters = method.getParameters(); for (final Parameter parameter : parameters) { if (parameter.isNamePresent()) { System.out.print(parameter.getName() + ' '); } } } public void test(String param1, int param2) { System.out.println(param1 + param2); } }
5、使用注解。
上面介绍的几种方法都需要依赖编译器附加一定的编译参数,才能获取到。如果程序编译不想保留这些调试信息和附加的元数据,或者你开发一个了框架提供给别人使用,可是该框架想要获取用户代码的函数参数名,因为你并不能控制别人怎么编译Java代码,这时怎么提供一种不受编译器影响的途径来确保获取到函数参数名呐?看看spring mvc是怎么做的——使用函数参数注解。下面使用注解来获取参数名的例子:
定义函数参数注解:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Parameter { String value(); }
使用该注解,并反射函数参数名:
import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class TestMain { public static void main(String[] args) throws Exception { Method method = TestMain.class.getMethod("test", String.class, int.class); System.out.print("test : "); Annotation parameterAnnotations[][] = method.getParameterAnnotations(); for (int i = 0; i < parameterAnnotations.length; i++) { for (Annotation annotation : parameterAnnotations[i]) { if (Parameter.class.equals(annotation.annotationType())) { System.out.print(((Parameter) annotation).value() + ' '); } } } } public void test(@Parameter("param1") String param1, @Parameter("param2") int param2) { System.out.println(param1 + param2); } }
-
实现回调(一)向回调函数传递额外的参数
2019-05-28 21:46:36大部分回调函数都有传递给它们的自动参数,如错误或结果缓冲区。使用回调时,常见的一个问题时如何调用给它们传递额外的参数。做到这一点的方法是在一个匿名函数中实现该参数,然后用来自匿名函数的参数调用回调函数...大部分回调函数都有传递给它们的自动参数,如错误或结果缓冲区。使用回调时,常见的一个问题时如何调用给它们传递额外的参数。做到这一点的方法是在一个匿名函数中实现该参数,然后用来自匿名函数的参数调用回调函数。
清单: 实现了创建一个匿名函数来添加未由事件发出的附加参数
清单: 实现了创建一个匿名函数来添加未由事件发出的附加参数 var events =require('events'); function CarShow() { events.EventEmitter.call(this); this.seeCar = function (make) { this.emit('sawCar',make); //触发事件 }; } CarShow.prototype.__proto__ = events.EventEmitter.prototype; //所有EventEmitter属性复制到Door对象。 var show =new CarShow(); function logCar(make) { console.log("Saw a" + make); } function logColorCar(make,color) { console.log("Saw a %s %s", color, make); } show.on("sawCar", logCar);//实现logCar(make)回调处理程序 show.on("sawCar", function (make) { //匿名函数随机添加颜色 var colors = ['red', 'blue', 'black']; var color = colors[Math.floor(Math.random() * 3)]; logColorCar(make,color); }); show.seeCar("Ferrari"); show.seeCar("Porsche"); show.seeCar("Bugatti"); show.seeCar("Lamborghini"); show.seeCar("Aston Martion");
结果
-
LSTM函数的各个参数的含义
2020-05-27 20:14:07# 这份文件的作用是作为一个示例,记录关于 LSTM 函数的各个参数的含义 import tensorflow as tf import numpy as np # 这里建立一个简单的模型演示 LSTM 层的特性 model = tf.keras.models.Sequential() model.... -
python中函数的参数和返回值
2020-11-29 11:51:33函数目标函数参数和返回值的作用函数的返回值 进阶函数的参数 进阶递归函数01. 函数参数和返回值的作用函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形式无参数,无返回值无参数,有... -
js动态添加input按钮并给按钮增加onclick的函数事件(带参数)
2017-12-01 14:41:43//当方法有参数时,用onclick = 方法名(参数)时就有错了,需要在方法名前面加function() inp.onclick = function () { b1(id); }; document.getElementById( "div" ).appendChild(inp); } else { alert... -
SendMessage 函数参数大全
2016-12-08 11:18:03Windows是一个消息驱动模式的系统,SendMessage ...由于 SendMessage 函数的参数选项过于繁多,因此很有必要作一个汇总,分门别类地来向大家介绍。 函数声明 LRESULT SendMessage( __in HWND hWnd, __in UINT Msg, -
损失函数解读 之 Focal Loss
2022-01-24 17:07:35前言 Focal loss 是一个在目标检测领域常用的损失函数,它是何凯明大佬在RetinaNet网络中提出的,解决了...交叉熵 损失函数 Focal Loss 代码实现Pytorch 什么是正负样本极不平衡? 目标检测算法为了定位目标会... -
如何在函数的默认传参之外额外传入自定义参数
2019-05-24 16:14:37在使用一些框架如element-ui时,经常会使用一些组件的默认事件,这些默认事件通常会有一些默认参数以便于使用。 例如: 远程搜索功能的自动补全输入框 <el-autocomplete></el-autocomplete> 它经常会被... -
subplots与figure函数参数解释说明以及简单的使用脚本实例
2017-08-22 14:39:26**fig_kw:把所有详细的关键字参数传给figure()函数 返回结果: fig:matplotlib.figure.Figure对象 ax:Axes(轴)对象或Axes(轴)对象数组。 matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, ... -
js之防抖函数
2020-09-14 22:13:40事件响应函数在一段时间后才执行,如果这段时间内再次调用,则重新计算执行时间 也就是说,在这个时间内,无论你怎么触发事件,我都不会执行,只有这段时间无操作后才会执行! 例如: 假如防抖设置为3秒 第一次执行事件后... -
js 动态根据后台接受的Map,String>参数 动态增加参数input框
2017-10-25 16:50:54js 动态根据后台接受的Map参数 动态增加参数input框 (1) var_row :对应参数条框的个数 hiscount : 记录上次弹出的参数条框的个数 showDiv : 参数条框上面div的id 删除条框的功能函数: (2)js 代码 修改... -
matplotlib之pyplot模块之柱状图(bar():基础参数、外观参数)
2021-02-19 18:43:46bar()函数概述 bar()函数用于绘制柱形图。 bar()的函数签名为matplotlib.pyplot.bar(x, height, ...bar()函数基础参数 bar()的基础参数如下: x:柱子在x轴上的坐标。浮点数或类数组结构。 height:柱子的高度,即y -
C++函数模板(模板函数)详解
2019-07-04 16:03:01C++函数模板(模板函数)详解定义用法:函数模板的原理延申用法2.1为什么需要类模板2.2单个类模板语法2.3继承中的类模板语法案例1:案例2:2.4类模板的基础语法2.5类模板语法知识体系梳理1.所有的类模板函数写在类的... -
js动态添加input按钮并给按钮增加onclick的函数事件带参数
2015-09-24 15:14:43js中动态给单元格增加一个input按钮,table的id=“pagelist" var nRow = $("pagelist").insertRow("此处为第几行:如3--->第三行添加"); nRow.className = "tableContent1"; nRow.insertCell(){ innerHTML = "";... -
Kotlin系列之扩展函数
2018-04-17 00:22:18简述: 今天带来的是Kotlin浅谈系列的第五弹,这讲主要是讲利用Kotlin中的扩展函数特性让我们的代码变得更加简单和整洁。扩展函数是Kotlin语言中独有的新特性,利用它可以减少很多的样板代码,大大提高开发的效率;... -
Yolov5 损失函数
2022-04-01 22:24:48Yolov5 损失函数正负样本匹配策略正样本个数的增加策略损失函数 正负样本匹配策略 本文的正负样本指的都是预测框而不是groundtruth框。正负样本是根据groundtruth框和anchor的匹配情况来确定的。 yolov3/4采用的都... -
Kotlin — 指定参数默认值生成class无参构造函数
2019-08-01 21:41:47当有框架通过反射的方式把一个类映射成一个对象的时候,需要这个类拥有一个无参构造函数,...在Kotlin中可以把所有的参数设置默认值,当生成字节码文件后会自动添加无参构造函数,如下图,通过反编译后看到已经生成... -
常见的损失函数,代价函数以及优化算法汇总
2019-07-17 15:33:40在机器学习和深度学习中,我们通常会需要掌握三个步骤就可以完成了,拿起数据(特征),搭上模型(目标函数,损失函数,代价函数),不断优化(优化函数-梯度下降,adam,动量-找到最优的W),就可以完成了 ... -
YOLO中参数和函数说明
2017-04-01 21:12:20YOLO:you only look once中参数和函数说明 1、画出的Box:为包围物体的ground truth。 2、lable标签: x y w h,(x,y)是box的位置,w,h是为box的宽度和高度是图片的宽度,高度的比值。在生成的lable中是这样的 -
ida反汇编窗口如何设置函数
2018-02-02 12:01:47第一行函数注释:一般选用可重复注释,可以在调用该函数处,方便看到关于该函数的注释。 第二行函数属性:可在编辑函数对话框中修改,这个属性的额意思是:不返回调用方、基于ebp栈帧。修改如下图: 第三行函数... -
Visual Basic快捷教程——函数与子程序
2017-04-19 22:30:14函数是结构化程序设计的基础。函数的本质就是为了把程序切分成若干个相对独立的模块各司其职,而各个函数的作用也就是仅仅专门负责自己份内的那份功能。在Visual Basic中,函数是一组以Function开头和End Function... -
损失函数
2018-10-23 10:27:221. 损失函数的定义 机器学习模型关于单个样本的预测值与真实值的差称为损失。损失越小,模型越好,如果预测值与真实值相等,就是没有损失。 用于计算损失的函数称为损失函数。模型每一次预测的好坏用损失函数来... -
Python基础之函数基本用法与进阶详解
2021-03-17 01:14:35分享给大家供大家参考,具体如下:目标函数参数和返回值的作用函数的返回值 进阶函数的参数 进阶递归函数01. 函数参数和返回值的作用函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形式无... -
SAR信号处理之窗函数13——窗函数与相位误差分析软件(Matlab版)
2022-01-22 17:47:23本软件的功能是分析窗函数和相位误差对脉冲压缩的影响,在Matlab环境下运行“PulseCompress_PhaseError_Win.m”软件。 -
Kotlin系列之消除函数重载
2018-03-09 22:08:55二、Kotlin中的函数命名参数 三、Kotlin中的函数默认值参数 四、@JvmOverloads注解解决Java调用Kotlin重载函数问题 五、需要注意的问题 一、函数重载的带来问题 1、遇到问题 无论是在Java或者C++中都有... -
R:关于数据框的函数
2014-10-27 09:27:24矩阵函数rbind()和cbind()也同样可以用于数据框,前提是两个数据框有相同的行数或者列数。例如,可以用cbind()向数据框中添加新的列,要求新的列与原有的列长度相同。用rbind()添加新行的时候,添加的行通常是数据...