在实际工作中,有时候需要动态获取某个类的方法参数名,一般反射机制是获取不到的,需要借助字节码工具才可以获取到。
package com.yanek.soa.test;
import java.lang.reflect.Modifier;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
public class MethodVariableNameUtil {
/**
* @param args
*/
public static void main(String[] args) {
String[] names=getMethodVariableName("com.yanek.soa.test.Test","test2");
for(String name:names)
{
System.out.println(name);
}
}
/**
* 获取方法的参数变量名称
* @param classname
* @param methodname
* @return
*/
public static String[] getMethodVariableName(String classname,String methodname){
try{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(classname);
CtMethod cm = cc.getDeclaredMethod(methodname);
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
String[] paramNames = new String[cm.getParameterTypes().length];
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
if (attr != null) {
int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
for (int i = 0; i < paramNames.length; i++){
paramNames[i] = attr.variableName(i + pos);
}
return paramNames;
}
}catch(Exception e){
System.out.println("getMethodVariableName fail "+e);
}
return null;
}
}
package com.yanek.soa.test;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
}
public String test(String a,String b,User user) {
return "hello";
}
public static String test2(String a,String b,User user) {
return "hello";
}
public static String test3(String p1,String p2,User user) {
return "hello";
}
}
执行 则可以获取到方法列表。相关maven依赖:
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>