通過javassit獲取
參見 http://blog.csdn.net/viviju1989/article/details/8529453
這篇文章的方法一,實現比較麻煩,就不說了。
通過spring的LocalVariableTableParameterNameDiscoverer
public static List<String> getParamterName(Class clazz, String methodName){
LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if (methodName.equals(method.getName())) {
String[] params = u.getParameterNames(method);
return Arrays.asList(params);
}
}
return null;
}
如果不用Class,而是通過spring注入的實例,然後instance.getClass.getDeclaredMethods()
則無法得到參數名,調試時看到方法名稱是通過jdk代理過的,拿不到參數名。
通過Java8的Parameter類
在Java 8之前的版本,代碼編譯爲class文件後,方法參數的類型是固定的,但參數名稱卻丟失了,這和動態語言嚴重依賴參數名稱形成了鮮明對比。現在,Java 8開始在class文件中保留參數名,給反射帶來了極大的便利。jdk8增加了類Parameter
public static List<String> getParameterNameJava8(Class clazz, String methodName){
List<String> paramterList = new ArrayList<>();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if (methodName.equals(method.getName())) {
Parameter[] params = method.getParameters();
for(Parameter parameter : params){
paramterList.add(parameter.getName());
}
}
}
return paramterList;
}
如果編譯級別低於1.8,得到的參數名稱是無意義的arg0、arg1……
遺憾的是,保留參數名這一選項由編譯開關javac -parameters
打開,默認是關閉的。
注意此功能必須把代碼編譯成1.8版本的class才行。
idea設置保留參數名:
在 preferences-》Java Compiler->設置模塊字節碼版本1.8,Javac Options中的 Additional command line parameters: -parameters