您的位置:首页 > 编程语言 > Java开发

使用javassist获取类方法参数名称列表

2018-01-22 09:56 811 查看
在实际工作中,有时候需要动态获取某个类的方法参数名,一般反射机制是获取不到的,需要借助字节码工具才可以获取到。
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息