使用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;
}
}
执行 则可以获取到方法列表。相关maven依赖:
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
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>
相关文章推荐
- 使用spring的LocalVariableTableParameterNameDiscoverer获取类方法参数名称列表
- 使用Java8获取方法参数名称
- java获取方法的参数名称列表
- 使用ASM获取java的构造函数参数名称和方法参数名称
- java 通过反射获取方法参数列表名称
- 默认参数是C++的特性,C中不支持 —— 在C中通过默认参数列表使用默认参数的方法
- 使用ChildObjects方法获取某个对象中包含的对象列表
- 利用Uri获取返回的参数即getQueryParameter()方法的使用
- 使用jquery获取url以及jquery获取url参数的方法
- 获取java方法中的参数名称
- java中使用DWR出现一个类原来方法可用新方法不可用(参数列表相同)
- javassist:增强型的java反射工具,获取方法参数名
- HTML中使用JS代码获取浏览器URL中的参数的方法
- 使用loadrunner11配置参数时,从oracle数据库中获取数据的方法
- js 获取函数的所有参数和遍历JavaScript某个对象所有的属性名称和值的方法
- 利用Uri获取返回的参数即getQueryParameter()方法的使用
- SharePoint 2010 使用url参数过滤列表视图数据(使用get方法过滤列表数据)
- 使用jquery获取url以及jquery获取url参数的方法
- 利用Javassist获取Java类中的方法参数名、参数类型、方法访问类型
- 利用Javassist获取Java类中的方法参数名、参数类型、方法访问类型