Java——通過反射獲取函式引數名稱
通過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
參考資料
相關文章
- 反射如何獲取函式的引數名反射函式
- 通過反射獲取上傳檔案方法引數中的檔名反射
- 如何透過AST樹去獲取JS函式引數名ASTJS函式
- 透過Lambda函式的方式獲取屬性名稱函式
- C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數C#反射
- 通過Java反射動態獲取資訊Java反射
- 反射-通過反射獲取成員變數並使用反射變數
- Android 通過名稱獲取資源IDAndroid
- 通過反射獲取類的類名,方法和內部成員變數反射變數
- 如何通過反射獲得方法的真實引數名(以及擴充套件研究)反射套件
- Spring AOP獲取攔截方法的引數名稱跟引數值Spring
- 通過反射獲取窗體例項反射
- 反射-通過反射獲取私有構造方法並使用反射構造方法
- javascript獲取函式定義的引數個數JavaScript函式
- El表示式獲取專案名稱
- 反射-通過反射獲取無參構造方法並使用反射構造方法
- 反射-通過反射獲取帶參構造方法並使用反射構造方法
- 通過反射獲取私有內部類物件反射物件
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- 通過 SHGetSpecialFolderLocation、SHGetPathFromIDList 函式獲取常用路徑函式
- 使用arguments物件獲取函式傳遞的引數物件函式
- python 獲取函式的所有引數列表:locals()Python函式
- Rust 問答之如何獲取 main 函式的引數RustAI函式
- http獲取get引數過濾HTTP
- js根據引數名獲取url上的引數值JS
- 使用 PHP 的 Filter 函式(過濾器)高效、安全地獲取請求引數PHPFilter函式過濾器
- arguments物件獲取給函式傳遞的實際引數物件函式
- Swift 1.1語言函式引數的特殊情況本地引數名外部引數名Swift函式
- Python動態引數、名稱空間、函式巢狀、global和nonlocalPython函式巢狀
- 3.3.2 函式的預設引數和佔位引數 函式過載函式
- Spring LocalVariableTableParameterNameDiscoverer獲取方法的引數名Spring
- 一個使用getopt()函式獲取命令列引數的例子(轉)函式命令列
- 4.2 函式的外部引數名 [Swift教程]函式Swift
- Java 獲取系統各項引數Java
- Java獲取本機名稱、本機MAC地址、IP地址JavaMac
- 【函式引數】Oracle 11g中使用“=>”顯式指明函式引數名與引數值的對應關係函式Oracle
- Swift學習筆記(三十)——函式的內部引數名和外部引數名Swift筆記函式
- C++行內函數、函式過載與函式預設引數C++函數函式