一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java獲取代碼中方法參數(shù)名信息的方法

Java獲取代碼中方法參數(shù)名信息的方法

2020-06-14 11:48i flym JAVA教程

在java中,可以通過(guò)反射獲取到類、字段、方法簽名等相關(guān)的信息,像方法名、返回值類型、參數(shù)類型、泛型類型參數(shù)等,但是不能夠獲取方法的參數(shù)名。在實(shí)際開(kāi)發(fā)場(chǎng)景中,有時(shí)需要根據(jù)方法的參數(shù)名做一些操作,那么該如何操作

前言

大家都知道隨著java8的使用,在相應(yīng)的方法簽名中增加了新的對(duì)象Parameter,用于表示特定的參數(shù)信息,通過(guò)它的getName可以獲取相應(yīng)的參數(shù)名.即像在代碼中編寫的,如命名為username,那么在前臺(tái)進(jìn)行傳參時(shí),即不需要再編寫如@Parameter("username")類的注解,而直接就能進(jìn)行按名映射.

如下的代碼參考所示:

?
1
2
3
4
5
6
7
8
9
10
11
public class T {
 private interface T2 {
  void method(String username, String password);
 }
 
 public static void main(String[] args) throws Exception {
  System.out.println(T.class.getMethod("main", String[].class).getParameters()[0].getName());
  System.out.println(T2.class.getMethod("method", String.class, String.class).getParameters()[0].getName());
  System.out.println(T2.class.getMethod("method", String.class, String.class).getParameters()[1].getName());
 }
}

按java8之前,也可以通過(guò)一些手段拿到參數(shù)名信息,只不過(guò)方式不同而已.如通過(guò)spring mvc中的ParameterMethodNameResolver在之前的版本中也可以正常工作.不過(guò)需要特別的編譯而已.這里面起作用的即是 LocalVariableTableMethodParameters,中文編譯為本地變量表和方法參數(shù)表.

LocalVariableTable 本地變量表

按jvm規(guī)范所述,本地變量表存在于Code屬性中,而Code屬性即又是methodInfo的一個(gè)屬性.可以理解為,當(dāng)一個(gè)方法有方法體時(shí),就會(huì)出現(xiàn)相應(yīng)的Code屬性,而且在code屬性中,除具體的執(zhí)行代碼外,還會(huì)有其它的信息.如LineNumberTable(用于描述每一行代碼所在的位置).

本地變量表屬于在方法中調(diào)試信息的一部分,因此默認(rèn)情況下這些信息是不會(huì)生成在class文件當(dāng)中的.需要開(kāi)啟 -g 或 -g:vars 開(kāi)關(guān).還好,對(duì)于ide或者是maven編譯來(lái)說(shuō),這些開(kāi)關(guān)都是默認(rèn)開(kāi)啟的.在ide中,可以通過(guò)設(shè)置(generate debugging info 針對(duì)idea)來(lái)控制(默認(rèn)打勾).在maven中,通過(guò)通過(guò)插件 maven-compiler-plugin 中的debug或debugLevel來(lái)控制是否輸出(默認(rèn)值是true).

本地變量表在javap之后,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
//非靜態(tài)方法
  LocalVariableTable:
  Start Length Slot Name Signature
   0  1  0 this LT;
   0  1  1 count J
   0  1  3 name Ljava/lang/String;
 
//靜態(tài)方法
  LocalVariableTable:
  Start Length Slot Name Signature
   0  101  0 args [Ljava/lang/String;

本地變量表不僅保存了參數(shù)信息,還保存在在整個(gè)方法體中可能會(huì)使用的臨時(shí)變量,如聲明的int i等.并且如上所示,表示方法和非靜態(tài)方法,在第一位還有this變量的區(qū)別.因此,可以通過(guò)讀取參數(shù)個(gè)數(shù)(method.getParameterCount),然后再根據(jù)方法簽名,讀取本地變量表中指定個(gè)數(shù)的參數(shù)信息即可.

需要注意的是,在上圖中,如果參數(shù)為long或double,其slot占位為2個(gè),在通過(guò)slot來(lái)獲取參數(shù)信息時(shí),需要考慮參數(shù)的類型信息.

接口方法由于沒(méi)有code屬性,因此也沒(méi)有本地變量表,拿到一個(gè)接口的方法定義,通過(guò)本地變量表是不能獲取到相應(yīng)的參數(shù)名的

MethodParameters 方法參數(shù)表

方法參數(shù)表是在1.8之后引入的,因此只是使用jdk8編譯生成的class文件才有此信息. 與本地變量表不同,它是屬于MethodInfo屬性的,即它是與Code屬性同一級(jí)別的.不管是接口方法還是普通的方法,都是有此屬性的.因此,即使是接口方法,也可以獲取相應(yīng)的參數(shù)信息.

默認(rèn)情況下,class中是沒(méi)有此信息的.需要使用特殊的編譯參數(shù) -parameters 才能生成,并且在ide和maven中,也默認(rèn)不會(huì)生成此信息.在idea中,需要在java additional line parameters中增加此編譯參數(shù).在maven中,也需要在maven-compiler-plugin的compilerArgs參數(shù)中增加此參數(shù)才行.

方法參數(shù)表在javap之后,表現(xiàn)為如下形式:

?
1
2
3
4
5
6
7
8
9
10
//非靜態(tài)方法
 MethodParameters:
  Name       Flags
  count
  name
 
//靜態(tài)方法
 MethodParameters:
  Name       Flags
  args

可以看出,無(wú)論是否靜態(tài),在參數(shù)表中,只會(huì)出現(xiàn)用于描述參數(shù)的信息.后面的Flags參數(shù)用于一些特殊的場(chǎng)景,比如final參數(shù)用于方法改寫等.

可使用的一些工具

除使用原生的api,以及spring工具包,還有其它一些工具都可以拿到參數(shù)名信息.在spring體系中,用于描述參數(shù)名的接口為 ParameterNameDiscoverer.通過(guò)它可以獲取相應(yīng)的參數(shù)名信息. 除此之外, com.thoughtworks.paranamer:paranamer 這一工具包中的Paranamer 也可以同樣進(jìn)行相應(yīng)信息的處理. 不過(guò)對(duì)于jdk8的methodParameters支持度還不是很高,使用者可以通過(guò)擴(kuò)展它來(lái)達(dá)到自己的目的.

總結(jié)

以上就是為大家總結(jié)的Java獲取代碼中方法參數(shù)名信息的方法,希望對(duì)大家學(xué)習(xí)或使用Java帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产福利微拍精品一区二区 | 四虎影视在线影院在线观看观看 | 99精品国产高清自在线看超 | 亚洲精品成人AV在线观看爽翻 | 亚洲色图.com | 好吊色永久免费视频大全 | 亚洲精品国产专区91在线 | 娇妻被又大又粗又长又硬好爽 | 无套啪啪| 久久久精品成人免费看 | 我在厨房摸岳的乳HD在线观看 | 亚洲精品91 | 情侣宾馆愉拍自拍视频 | 日本大乳护士的引诱图片 | 欧美一级专区免费大片俄罗斯 | 亚洲国产成人久久综合一区77 | 国产成人综合手机在线播放 | 日本高清色视频www 日本高清免费观看 | 99视频久久| tolove第一季动画在线看 | 国产一卡2卡3卡四卡国色天香 | 女人日男人 | 69日本xxⅹxxxxx19 | 完整秽淫刺激长篇小说 | 日韩a无吗一区二区三区 | 国产成人综合网 | 冰漪丰满大乳人体图片欣赏 | 精品国产三级av在线 | 美女和男人一起差差 | 欧美摸胸 | 成人榴莲视频 | 满溢游泳池免费 | 欧美同性猛男野外gay免费 | 久久热这里面只有精品 | 数学老师扒开腿让我爽快 | 亚洲国产精品久久精品成人网站 | 二次元美女脱裤子让男人桶爽 | 亚洲精品一区二区观看 | 波多野结衣xxxx性精品 | 日本乱中文字幕系列在线观看 | 免费日批视频 |