1.JavaAssistUtils.java
package org.example.testJavaAssist;
import javassist.*;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import java.util.ArrayList;
import java.util.List;
public class JavaAssistUtils {
public static List<String> getParamNames(String methodName, Class<?> clazz) {
List<String> paramNames = new ArrayList<>();
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(new ClassClassPath(JavaAssistUtils.class));
try {
CtClass ctClass = pool.getCtClass(clazz.getName());
CtMethod ctMethod = ctClass.getDeclaredMethod(methodName);
// 使用javassist的反射方法的参数名
javassist.bytecode.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;
for (int i = 0; i < len; i++) {
paramNames.add(attr.variableName(i + pos));
}
}
return paramNames;
} catch (NotFoundException e) {
e.printStackTrace();
return null;
}
}
}
2.Student.java
package org.example.testJavaAssist;
public class Student {
public void func1(int age, String name, Info info) {
}
}
3.Info.java
package org.example.testJavaAssist;
import lombok.Data;
@Data
public class Info {
private int age;
private String address;
}
4.Main.java
package org.example.testJavaAssist;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> func1 = JavaAssistUtils.getParamNames("func1", Student.class);
System.out.println(func1);
}
}
/*
[age, name, info]
*/