java parameter name_Java 获取class method parameter name

packageorg.rx.util;import org.objectweb.asm.*;importjava.io.IOException;importjava.io.InputStream;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;importjava.util.Arrays;/*** Created by za-wangxiaoming on 2017/7/4.*/

public classParameterNameUtils {/*** 获取指定类指定方法的参数名

*

*@paramclazz 要获取参数名的方法所属的类

*@parammethod 要获取参数名的方法

*@return按参数顺序排列的参数名列表,如果没有参数,则返回null*/

public static String[] getMethodParameterNamesByAsm4(Class> clazz, finalMethod method) {final Class>[] parameterTypes =method.getParameterTypes();if (parameterTypes == null || parameterTypes.length == 0) {return null;

}final Type[] types = newType[parameterTypes.length];for (int i = 0; i < parameterTypes.length; i++) {

types[i]=Type.getType(parameterTypes[i]);

}final String[] parameterNames = newString[parameterTypes.length];

String className=clazz.getName();int lastDotIndex = className.lastIndexOf(".");

className= className.substring(lastDotIndex + 1) + ".class";

InputStream is=clazz.getResourceAsStream(className);try{

ClassReader classReader= newClassReader(is);

classReader.accept(newClassVisitor(Opcodes.ASM4) {

@Overridepublic MethodVisitor visitMethod(intaccess, String name, String desc, String signature,

String[] exceptions) {//只处理指定的方法

Type[] argumentTypes =Type.getArgumentTypes(desc);if (!method.getName().equals(name) || !Arrays.equals(argumentTypes, types)) {return null;

}return newMethodVisitor(Opcodes.ASM4) {

@Overridepublic voidvisitLocalVariable(String name, String desc, String signature, Label start,

Label end,intindex) {//静态方法第一个参数就是方法的参数,如果是实例方法,第一个参数是this

if(Modifier.isStatic(method.getModifiers())) {

parameterNames[index]=name;

}else if (index > 0) {

parameterNames[index- 1] =name;

}

}

};

}

},0);

}catch(IOException e) {

e.printStackTrace();

}returnparameterNames;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值