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#反射
- Android 通過名稱獲取資源IDAndroid
- Spring AOP獲取攔截方法的引數名稱跟引數值Spring
- 如何通過WinDbg獲取方法引數值
- 通過反射獲取私有內部類物件反射物件
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- Spring LocalVariableTableParameterNameDiscoverer獲取方法的引數名Spring
- Rust 問答之如何獲取 main 函式的引數RustAI函式
- Python動態引數、名稱空間、函式巢狀、global和nonlocalPython函式巢狀
- http獲取get引數過濾HTTP
- 使用 PHP 的 Filter 函式(過濾器)高效、安全地獲取請求引數PHPFilter函式過濾器
- 獲取類名稱的方法
- 3.3.2 函式的預設引數和佔位引數 函式過載函式
- 4.2 函式的外部引數名 [Swift教程]函式Swift
- Java 獲取系統各項引數Java
- C++行內函數、函式過載與函式預設引數C++函數函式
- 函式引數 引數定義函式型別函式型別
- C#獲取日期的星期名稱C#
- gofiber: 獲取引數Go
- JAVA之反射學習3-反射獲取成員變數並賦值Java反射變數賦值
- org.reflections 介面通過反射獲取實現類原始碼研究反射原始碼
- Gson通過藉助TypeToken獲取泛型引數的型別的方法泛型型別
- zblog獲取GET/POST等值函式“GetVars”引數和使用方法介紹函式
- 【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何來獲取Token呢 (通過使用者名稱和密碼方式獲取Access Token)DeveloperROS密碼
- PHP 獲取不帶名稱空間的類名PHP
- C++ 獲取指定的過載函式地址C++函式
- java web 通過request獲取客戶端IPJavaWeb客戶端
- Kubernetes 教程:根據 PID 獲取 Pod 名稱
- 利用雲函式來實現獲取特定路徑+引數的小程式碼函式
- mysql 獲取當前日期函式及時間格式化引數詳解MySql函式
- OpenFeign @PathVariable需註明引數名稱
- JavaScript—獲取引數(23)JavaScript
- js獲取url傳遞引數,js獲取url?號後面的引數JS
- 教你在Nodejs中如何獲取當前函式被呼叫的行數及檔名NodeJS函式
- shell指令碼中main函式中$#獲取不到指令碼傳入引數個數淺析指令碼AI函式
- Javascript函式引數求值——Thunk函式JavaScript函式