日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java反射 获取方法参数名_java 反射借助 asm 获取参数名称最优雅简单的方式

發布時間:2025/3/12 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java反射 获取方法参数名_java 反射借助 asm 获取参数名称最优雅简单的方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景說明

最近寫反射相關的代碼,想獲取對應的參數名稱,卻發現沒有特別好的方式。

jdk7 及其以前,是無法通過反射獲取參數名稱的。

jdk8 可以獲取,但是要求指定 -parameter 啟動參數,限制較多。

期間嘗試過類似于 Mybatis 使用 @Param 的方式,但是感覺不夠優雅,后來發現了下面的這個工具。

asm-tool 是基于 asm 構建的常見工具類。

下面簡單介紹下使用方式。

快速開始

準備

jdk 1.7+

maven 3.x+

maven 引入

com.github.houbb

asm-tool

0.0.2

獲取方法參數名稱

測試方法

AsmMethodsTest 類下定義一個帶有參數的方法

public String common(String name) {

return name;

}

獲取參數名稱

通過 AsmMethods.getParamNamesByAsm(Method) 獲取參數名稱。

Method method = ClassUtil.getMethod(AsmMethodsTest.class,

"common", String.class);

List param = AsmMethods.getParamNamesByAsm(method);

Assert.assertEquals("[name]", param.toString());

第一行獲取我們定義的方法對應的 Method 信息;

第一行直接調用獲取結果;

第三行進行斷言驗證。

基于參數注解

參數注解

使用過 mybatis 的開發對于 @Param 注解應該并不陌生。

其實這也是一種解決獲取方法名稱的方式,那就是基于 @Param 注解。

@Param 注解

這個注解非常簡單,直接可以定義在參數列表上,用于顯示指定該字段的名稱。

public String forParam(@Param("name") String name) {

return name;

}

獲取方式

通過 AsmMethods.getParamNamesByAnnotation(Method) 即可獲取。

Method method = ClassUtil.getMethod(AsmMethodsTest.class,

"forParam", String.class);

List param = AsmMethods.getParamNamesByAnnotation(method);

Assert.assertEquals("[name]", param.toString());

未指定注解的場景

如果你沒有指定注解,則會返回 arg0/arg1/... 這樣的結果。

Method method = ClassUtil.getMethod(AsmMethodsTest.class,

"common", String.class);

List param = AsmMethods.getParamNamesByAnnotation(method);

Assert.assertEquals("[arg0]", param.toString());

獲取構造器參數名稱

簡介

和獲取方法非常類似。

也有基于注解和基于 asm 兩種方式。

基于注解

構造器定義

public ConstructorService(@Param("age") Integer age) {

}

獲取參數名稱

Constructor constructor = ClassUtil.getConstructor(ConstructorService.class, Integer.class);

List param = AsmMethods.getParamNamesByAnnotation(constructor);

Assert.assertEquals("[age]", param.toString());

基于 asm

構造器定義

public ConstructorService(String name) {

}

獲取參數名稱

Constructor constructor = ClassUtil.getConstructor(ConstructorService.class, String.class);

List param = AsmMethods.getParamNamesByAsm(constructor);

Assert.assertEquals("[name]", param.toString());

總結

以上是生活随笔為你收集整理的java反射 获取方法参数名_java 反射借助 asm 获取参数名称最优雅简单的方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。