最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年09月11日 09:20:55   作者:i flym  
在java中,可以通過反射獲取到類、字段、方法簽名等相關(guān)的信息,像方法名、返回值類型、參數(shù)類型、泛型類型參數(shù)等,但是不能夠獲取方法的參數(shù)名。在實(shí)際開發(fā)場景中,有時(shí)需要根據(jù)方法的參數(shù)名做一些操作,那么該如何操作了呢?下面就通過這篇文章來學(xué)習(xí)學(xué)習(xí)吧。

前言

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

如下的代碼參考所示:

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之前,也可以通過一些手段拿到參數(shù)名信息,只不過方式不同而已.如通過spring mvc中的ParameterMethodNameResolver在之前的版本中也可以正常工作.不過需要特別的編譯而已.這里面起作用的即是 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)中的.需要開啟 -g 或 -g:vars 開關(guān).還好,對于ide或者是maven編譯來說,這些開關(guān)都是默認(rèn)開啟的.在ide中,可以通過設(shè)置(generate debugging info 針對idea)來控制(默認(rèn)打勾).在maven中,通過通過插件 maven-compiler-plugin 中的debug或debugLevel來控制是否輸出(默認(rèn)值是true).

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

//非靜態(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ū)別.因此,可以通過讀取參數(shù)個(gè)數(shù)(method.getParameterCount),然后再根據(jù)方法簽名,讀取本地變量表中指定個(gè)數(shù)的參數(shù)信息即可.

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

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

MethodParameters 方法參數(shù)表

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

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

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

//非靜態(tài)方法
 MethodParameters:
  Name       Flags
  count
  name
 
//靜態(tài)方法
 MethodParameters:
  Name       Flags
  args

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

可使用的一些工具

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

總結(jié)

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

相關(guān)文章

  • Mybatis和orcale update語句中接收參數(shù)為對象的實(shí)例代碼

    Mybatis和orcale update語句中接收參數(shù)為對象的實(shí)例代碼

    Mybatis的 mapper.xml 中 update 語句使用 if 標(biāo)簽判斷對像屬性是否為空值。本文重點(diǎn)給大家介紹Mybatis和orcale update語句中接收參數(shù)為對象的實(shí)例代碼,需要的朋友參考下吧
    2017-09-09
  • Java實(shí)戰(zhàn)之鮮花商城系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之鮮花商城系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Java語言實(shí)現(xiàn)鮮花商城系統(tǒng),文中采用的技術(shù)有Spring、SpringMVC、Mybatis、JSP等,感興趣的小伙伴可以了解一下
    2022-05-05
  • 淺談java中Map的用法

    淺談java中Map的用法

    Map簡介:將鍵映射到值的對象。一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射到一個(gè)值。此接口取代 Dictionary 類,后者完全是一個(gè)抽象類,而不是一個(gè)接口。
    2015-09-09
  • java實(shí)現(xiàn)希爾排序算法

    java實(shí)現(xiàn)希爾排序算法

    希爾排序(Shell Sort)是插入排序的一種,是針對直接插入排序算法的改進(jìn),是將整個(gè)無序列分割成若干小的子序列分別進(jìn)行插入排序,希爾排序并不穩(wěn)定。該方法又稱縮小增量排序,因DL.Shell于1959年提出而得名。
    2015-04-04
  • Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized底層優(yōu)化

    Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized底層優(yōu)化

    這篇文章主要介紹了Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized底層優(yōu)化的相關(guān)資料,主要包含了重量級鎖,輕量級鎖,偏向鎖和其他優(yōu)化等方面,有需要的小伙伴可以參考下
    2016-05-05
  • 淺談Java中ThreadLocal內(nèi)存泄露的原因及處理方式

    淺談Java中ThreadLocal內(nèi)存泄露的原因及處理方式

    內(nèi)存泄漏就是我們申請了內(nèi)存,但是該內(nèi)存一直無法釋放,就會(huì)導(dǎo)致內(nèi)存溢出問題,本文詳細(xì)的介紹了ThreadLocal內(nèi)存泄露的原因及處理方式,感興趣的可以了解一下
    2023-05-05
  • SpringBoot3整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例

    SpringBoot3整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例

    Quartz 是一個(gè)開源的任務(wù)調(diào)度框架,用于在應(yīng)用程序中創(chuàng)建、管理和調(diào)度定時(shí)任務(wù),將 Quartz 和 Spring Boot 3 結(jié)合,可以輕松實(shí)現(xiàn)定時(shí)任務(wù)的靈活管理,本文將詳細(xì)介紹如何在 Spring Boot 3 項(xiàng)目中集成 Quartz Scheduler 并實(shí)現(xiàn)示例任務(wù)的調(diào)度,需要的朋友可以參考下
    2024-11-11
  • Spring IOC簡單理解及創(chuàng)建對象的方式

    Spring IOC簡單理解及創(chuàng)建對象的方式

    這篇文章主要介紹了Spring IOC簡單理解及創(chuàng)建對象的方式,本文通過兩種方式給大家介紹創(chuàng)建對象的方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • 10本Java架構(gòu)師必讀書籍

    10本Java架構(gòu)師必讀書籍

    這篇文章主要介紹了10本Java架構(gòu)師必讀書籍,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問題

    java圖論弗洛伊德和迪杰斯特拉算法解決最短路徑問題

    這篇文章主要為大家介紹了java圖論弗洛伊德算法和迪杰斯特拉算法解決最短路徑的問題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11

最新評論

浪卡子县| 霍州市| 曲麻莱县| 会宁县| 阳信县| 甘洛县| 兰州市| 外汇| 措美县| 高青县| 阳朔县| 新丰县| 开阳县| 进贤县| 大洼县| 河津市| 临沧市| 邹城市| 朝阳县| 吴堡县| 龙游县| 曲水县| 马鞍山市| 迁安市| 濮阳县| 弥渡县| 台州市| 盖州市| 鄄城县| 泰宁县| 宝兴县| 阿图什市| 固阳县| 密山市| 乐清市| 嘉鱼县| 新龙县| 崇左市| 宁南县| 隆林| 黑河市|