精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java如何獲取方法參數具體名稱?這是個好問題!

開發 后端
默認情況下,我們是無法獲取方法中參數名稱的。通過反射機制,也只能得到參數的順序以及一些沒有意義的變量:arg0、arg1等等。

默認情況下,我們是無法獲取方法中參數名稱的。通過反射機制,也只能得到參數的順序以及一些沒有意義的變量:arg0、arg1等等。

但我們又確實需要這部分信息。比如IDE的自動提示,文檔化服務接口的詳細信息等。

這是因為,這些變量的名字,根本就沒有編譯進class文件中,它不可能憑空產生。

[[333160]]

在JDK 8之后,可以通過在編譯時指定-parameters選項,將方法的參數名記入class文件,并在運行時通過反射機制獲取相關信息。

如果你的項目是實用maven構建,那么就可以加入幾行配置,追加參數。

  1. <plugin>   
  2.     <artifactId>maven-compiler-plugin</artifactId>   
  3.     <version>3.8.0</version>   
  4.     <configuration>   
  5.         <source>1.8</source>   
  6.         <target>1.8</target>   
  7.         <encoding>utf8</encoding>   
  8.         <compilerArgs>   
  9.             <arg>-parameters</arg>   
  10.         </compilerArgs>   
  11.     </configuration>   
  12. </plugin>   

如果是用的IDEA等編輯器,也可以通過設置界面進行配置。不過不推薦這樣,因為你的這些配置不好進行共享。

在普通Java項目里,就可以通過下面的方式來獲取反射數據。Method.getParameters這個方法是新加的。

  1. public class Test { 
  2.    
  3.     public static void main(String[] args) throws Exception{ 
  4.         Class clazz = Class.forName("com.test.MethodParameterTest"); 
  5.         Method[] methods = clazz.getMethods(); 
  6.         Constructor[] constructors = clazz.getConstructors(); 
  7.         for (Constructor constructor : constructors) { 
  8.             System.out.println("+++" + constructor.getName()); 
  9.             Parameter[] parameters = constructor.getParameters(); 
  10.             for (Parameter parameter : parameters) { 
  11.                 printParameter(parameter); 
  12.             } 
  13.         } 
  14.    
  15.         System.out.println("------------------"); 
  16.         for (Method method : methods) { 
  17.             System.out.println(method.getName()); 
  18.             Parameter[] parameters = method.getParameters(); 
  19.             for (Parameter parameter : parameters) { 
  20.                 printParameter(parameter); 
  21.             } 
  22.         } 
  23.     } 
  24.    
  25.     private static void printParameter(Parameter parameter) { 
  26.         //參數名 
  27.         System.out.println("\t\t" + parameter.getName()); 
  28.         //是否在源碼中隱式聲明的參數名 
  29.         System.out.println("\t\t\t implicit:" + parameter.isImplicit()); 
  30.         //類文件中,是否存在參數名 
  31.         System.out.println("\t\t\t namePresent:" + parameter.isNamePresent()); 
  32.         //是否為虛構參數 
  33.         System.out.println("\t\t\t synthetic:" + parameter.isSynthetic()); 
  34.         System.out.println("\t\t\t VarArgs:" + parameter.isVarArgs()); 
  35.     } 

下面介紹幾個方法的意義:

isImplicit()

參數是否為隱式聲明在源文件中,比如內部類,默認構造函數(無參)其實在編譯成class時將會把包含它的主類引用作為首個參數,此參數即為隱式聲明。

如果為true,即表示有JDK編譯器隱式生成在class文件中的方法參數,而source文件中并不可見。常規的普通方法,此值為false。

isNamePresent()

此參數在class文件中是否有此參數名;受制于在編譯時是否指定了“-parameter”,對于指定此參數的編譯文件,通常為true;對于JDK 內部類、默認編譯的類,通常為false;此時你會發現,它們的參數名通常為表意名稱:arg0、arg1等等,此時為false。

isSynthetic()

是否為“虛構”參數,如果為true,表示既不是“顯式”聲明、也不是隱式聲明在源文件中的參數,比如enum類的“values()”、“valueOf(String)”這是編譯器“虛構”的系統方法。

在Spring環境中,由于有工具類的支持,會更加方便一些。

  1. public class SpringTest { 
  2.    
  3.     private static final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); 
  4.    
  5.    
  6.     public static void main(String[] args) throws Exception{ 
  7.         Class clazz = Class.forName("com.test.MethodParameterTest"); 
  8.         Method[] methods = clazz.getMethods(); 
  9.         for (Method method : methods) { 
  10.             System.out.println(method.getName()); 
  11.             //JDK 1.8 + is better. 
  12.             String[] parameterNames = parameterNameDiscoverer.getParameterNames(method); 
  13.             if (parameterNames == null) { 
  14.                 continue; 
  15.             } 
  16.             for (String pn : parameterNames) { 
  17.                 System.out.println("\t\t" + pn); 
  18.             } 
  19.         } 
  20.     } 

那Java版本低于1.8的時候,又是怎么獲取的呢?我們可以參考Spring的LocalVariableTableParameterNameDiscoverer類。

  1. public String[] getParameterNames(Method method) { 
  2.         Method originalMethod = BridgeMethodResolver.findBridgedMethod(method); 
  3.         return doGetParameterNames(originalMethod); 
  4. @Nullable 
  5. private String[] doGetParameterNames(Executable executable) { 
  6.         Class<?> declaringClass = executable.getDeclaringClass(); 
  7.         Map<Executable, String[]> map = this.parameterNamesCache.computeIfAbsent(declaringClass, this::inspectClass); 
  8.         return (map != NO_DEBUG_INFO_MAP ? map.get(executable) : null); 

最后就走到了inspectClass方法中。

  1. private Map<Executable, String[]> inspectClass(Class<?> clazz) { 
  2.         InputStream is = clazz.getResourceAsStream(ClassUtils.getClassFileName(clazz)); 
  3.         if (is == null) { 
  4.             // We couldn't load the class file, which is not fatal as it 
  5.             // simply means this method of discovering parameter names won't work. 
  6.             if (logger.isDebugEnabled()) { 
  7.                 logger.debug("Cannot find '.class' file for class [" + clazz + 
  8.                         "] - unable to determine constructor/method parameter names"); 
  9.             } 
  10.             return NO_DEBUG_INFO_MAP; 
  11.         } 
  12.         try { 
  13.             ClassReader classReader = new ClassReader(is); 
  14.             Map<Executable, String[]> map = new ConcurrentHashMap<>(32); 
  15.             classReader.accept(new ParameterNameDiscoveringVisitor(clazz, map), 0); 
  16.             return map; 
  17.         } 
  18.         ... 

可以看到,這種情況下,Spring是通過直接讀取class文件進行解析的。實際上是通過讀取LocalVariableTable中的數據進行獲取的。如果你編譯的時候沒有加入這些debug選項,同樣也拿不到方法參數的具體名稱。

總結一下

  • Java8以前,讀取Class中的LocalVariableTable屬性表,需要編譯時加入參數-g或者-g:vars 獲取方法局部變量調試信息;
  • Java8及其以后,通過java.lang.reflect.Parameter#getName即可獲取,但需要編譯時加入參數-parameters參數。

 

責任編輯:趙寧寧 來源: 小姐姐味道
相關推薦

2017-02-05 10:21:10

程序員好問題

2015-05-05 09:39:57

編程被編程

2021-10-01 00:02:54

CHAR VARCHARMYSQL

2020-06-21 05:55:45

勒索軟件攻擊贖金

2009-11-24 14:21:17

2020-02-17 21:17:40

www域名主機

2010-06-08 16:21:46

如何安裝Opensus

2017-06-02 08:48:29

互斥鎖JavaCAS

2018-05-29 09:08:16

vSAN 塊存儲應用

2010-02-06 11:19:33

C++獲取文件

2010-03-18 11:18:54

Java main方法

2020-08-04 16:56:50

Java方法參數

2010-07-27 11:09:43

設置NFS

2009-11-23 15:10:28

PHP獲取當前url

2009-06-30 13:54:00

名稱空間Java

2020-01-20 14:44:03

云計算架構IT

2017-04-25 14:58:02

網絡可見性漏洞

2012-09-13 10:44:32

Web設計Web分頁架構設計

2018-03-05 08:52:57

2009-12-07 19:34:01

PHP函數可變參數列表
點贊
收藏

51CTO技術棧公眾號

日本美女在线中文版| 国产精品无码粉嫩小泬| 久久久久97| 欧洲视频一区二区| 永久免费看av| 日本v片在线免费观看| 久久精品国产网站| 欧美极品少妇全裸体| 99久久久无码国产精品性| 四虎影视国产精品| 欧美日韩免费网站| 男女h黄动漫啪啪无遮挡软件| 天天操天天干天天干| 久久精品国产秦先生| 97精品伊人久久久大香线蕉| 亚洲一级二级片| 亚洲人成网www| 欧美一卡二卡三卡四卡| 激情五月亚洲色图| av在线最新| 亚洲黄一区二区三区| 欧美视频观看一区| 日本美女一级视频| 国产在线国偷精品免费看| 日本精品久久久久影院| 国产精品9191| 欧美国产91| 在线电影欧美日韩一区二区私密| 日本五十肥熟交尾| 在线播放一区二区精品视频| 欧美欧美欧美欧美| 国产免费视频传媒| 亚洲精品成人图区| 午夜久久久久久久久| 日韩最新中文字幕| 日本最黄一级片免费在线| 久久久国产精品不卡| 国精产品一区二区| 高潮一区二区三区乱码| 国产精品性做久久久久久| 国产精品第二页| 五月天激情四射| 亚洲伊人网站| 91国产精品电影| 亚洲国产精品成人无久久精品| 久久久久国产| 久久天堂电影网| 天天看天天摸天天操| 久久亚洲国产| 搡老女人一区二区三区视频tv| 手机毛片在线观看| 欧美精选一区二区三区| 一区二区三区 在线观看视| 人妻体内射精一区二区| 蜜桃一区二区| 一区二区三区日韩在线| 在线免费观看视频| 日韩电影一区| www.久久久久久.com| 在线视频这里只有精品| 91九色精品| 超碰日本道色综合久久综合| 欧美日韩免费一区二区| 欧美日韩一区二区国产| 高清欧美一区二区三区| 国产精品视频免费播放| 久久天堂精品| 国产免费成人av| 国产又粗又大又爽视频| 国产精品99久久久| 国产一区二区三区高清| 欧洲一区av| 国产精品久久久一本精品 | 97精品免费视频| 看片网址国产福利av中文字幕| 久久精品观看| 成人国产精品免费视频| 亚洲第一天堂在线观看| www.亚洲色图| 日韩av电影免费观看| 日本a级在线| 一区二区三区美女视频| 久久国产成人精品国产成人亚洲| 日本中文字幕一区二区| 日韩一级二级三级| 搡老熟女老女人一区二区| sdde在线播放一区二区| 欧美美最猛性xxxxxx| 久久99精品波多结衣一区| 喷水一区二区三区| 高清不卡一区二区三区| 国产精品秘入口| 亚洲精品写真福利| 男人天堂999| 国产精品亚洲一区二区在线观看| 亚洲黄色av网站| 亚洲图片第一页| 影音先锋一区| 国产免费一区二区三区在线观看| 亚洲av无码国产精品久久不卡| 久久影院视频免费| 日韩精品一区二区三区电影| 中文字幕一区久| 精品少妇一区二区三区日产乱码 | 欧美aaaa视频| 97热精品视频官网| 一二三四区在线| 91一区二区在线| 欧美在线观看黄| 丁香婷婷久久| 日韩av中文在线| 国产极品国产极品| 久久不射中文字幕| 国产传媒一区| 好吊日视频在线观看| 在线精品观看国产| 欧美熟妇精品一区二区蜜桃视频| 日韩综合在线| 日韩av观看网址| 日韩中文字幕观看| 一区二区三区精品在线观看| 另类小说色综合| 男男gay无套免费视频欧美| 久久噜噜噜精品国产亚洲综合| 亚洲网站免费观看| 国产欧美日韩一区二区三区在线观看| 国产在线播放观看| 日韩一区二区三区精品| 久久视频免费在线播放| 自拍偷拍色综合| 久久久精品日韩欧美| 霍思燕三级露全乳照| 日本超碰一区二区| 精品国偷自产在线| 国产又粗又黄又爽的视频| 国产欧美一区二区精品久导航| 精品99在线视频| 国产精品xxx在线观看| 久久久久久久电影一区| 亚洲AV无码一区二区三区性| 亚洲欧美韩国综合色| 91精品999| 51精产品一区一区三区| 91网站免费观看| 欧美成年黄网站色视频| 欧美日韩成人综合| 91传媒免费观看| 精品无码三级在线观看视频| 天堂v在线视频| 精品91福利视频| 欧美人与性动交a欧美精品| 国产av一区二区三区| 亚洲啪啪综合av一区二区三区| 欧美国产日韩在线视频| 欧美激情1区2区| 国产99视频精品免费视频36| 久久五月精品中文字幕| 日韩av在线导航| 天堂网一区二区| 亚洲国产精品v| 亚洲精品手机在线观看| 亚洲国产精品久久久天堂 | aaa一区二区| 一区二区三区在线播放| 动漫av在线免费观看| 一区二区三区国产盗摄| 日本一区二区三区视频在线播放| 国产精品久久乐| 久久香蕉国产线看观看网| 国产成人精品白浆久久69| 亚洲一区二区美女| 欧美r级电影在线观看| 性生交大片免费全黄| 国产精品69久久久久水密桃| 成人一区二区免费视频| 伊人久久大香线蕉无限次| 国产精品夜色7777狼人| 一区二区三区伦理| 日韩黄色高清视频| 亚洲图片小说视频| 亚洲一区二区三区四区五区中文 | 在线日韩一区| 国产男人精品视频| 国产美女一区视频| 亚洲无限av看| www久久久com| 色综合久久66| 欧美黑人一级片| 久久人人爽爽爽人久久久| 亚洲欧美手机在线| 国产精品一卡| 日韩第一页在线观看| 少妇高潮一区二区三区| 91久久夜色精品国产网站| 欧美男男tv网站在线播放| 色婷婷av一区二区三区久久| 亚洲日本一区二区三区在线不卡| 成人国产精品久久| 51精品在线观看| 91精品国产91久久久久久青草| 亚洲精品国产综合久久| 国产日韩在线观看一区| 一本久久a久久免费精品不卡| 亚洲成人生活片| 国产欧美日韩中文久久| 日批在线观看视频| 国产一区二区三区美女| 亚洲人成无码www久久久| 国产精品videosex极品| 亚洲女人毛片| 深夜福利久久| 国模一区二区三区私拍视频| 国产在线一区不卡| 国产精品大片wwwwww| 乡村艳史在线观看| 久久久久久尹人网香蕉| а√资源新版在线天堂| 在线丨暗呦小u女国产精品| 艳母动漫在线看| 日韩免费一区二区三区在线播放| 亚洲一级特黄毛片| 日本精品一级二级| 国产又大又黄视频| 午夜精品一区二区三区三上悠亚| 欧美日韩在线视频免费播放| 国产精品免费aⅴ片在线观看| 国产一二三四五区| 2022国产精品视频| 国产麻豆剧传媒精品国产av| 国产米奇在线777精品观看| 在线观看国产福利| 久久爱www久久做| 亚洲欧洲日本精品| 日本中文一区二区三区| 国产日韩成人内射视频| 久久一二三区| 国产淫片av片久久久久久| 国产精品久久久亚洲一区| 欧美日韩精品在线一区二区 | 日韩理论电影中文字幕| 国产精品视频入口| 久久99精品国产自在现线| 国产一区二区在线观看免费播放| 国产欧美自拍一区| 国产亚洲一区二区三区在线播放| 成人av综合网| 国产一区二区中文字幕免费看| 高清一区二区三区| 狠狠久久综合婷婷不卡| 日本欧美三级| 欧美日韩电影一区二区| 欧美日韩性在线观看| 亚洲一区3d动漫同人无遮挡 | 国产精品成人免费| 黄视频网站免费看| 一区二区三区欧美| 91蜜桃视频在线观看| 欧美性猛交xxxx偷拍洗澡| 日本熟女毛茸茸| 欧美日韩在线播放三区四区| 91禁在线观看| 欧美va在线播放| 天天干天天爽天天操| 亚洲色图美腿丝袜| 一级日本在线| 久久综合网hezyo| 啊啊啊久久久| 国产aⅴ夜夜欢一区二区三区| 不卡亚洲精品| 亚洲精品日韩激情在线电影| 91精品国产自产精品男人的天堂| 国产一区二区高清不卡| 精品国产乱码久久久| 一区二区三区四区| 今天的高清视频免费播放成人| 免费看国产曰批40分钟| 日本中文字幕一区| 一个人看的视频www| 成人av在线看| 国产精品久久免费观看| 亚洲视频在线一区观看| 日韩黄色一级大片| 欧美三区免费完整视频在线观看| 在线黄色av网站| 精品1区2区在线观看| 爱久久·www| 欧美人与性动交| 午夜欧美巨大性欧美巨大| 91免费版网站入口| 日韩影视高清在线观看| 一区二区免费电影| 日韩五码在线| 亚洲黄色av片| 国产亚洲综合在线| 久久精品这里有| 欧美日韩精品高清| 桃花色综合影院| 久99久在线视频| 成人在线不卡| 欧美精品一区二区视频| 午夜国产精品视频免费体验区| 欧洲av无码放荡人妇网站| 国产精品资源在线| 极品久久久久久久| 天天综合网 天天综合色| 亚洲一级在线播放| 亚洲人在线视频| 国产盗摄精品一区二区酒店| 国产精品爽黄69| 亚洲v天堂v手机在线| a级黄色片免费| 美女看a上一区| 中文字幕一二三四区| 亚洲成a人片在线观看中文| 国产精品探花视频| 在线观看久久久久久| 日本在线啊啊| 国产九区一区在线| 中文字幕一区二区精品区| 国产精品日韩在线| 中文字幕网址在线| 日韩av影视在线| 丁香花在线高清完整版视频| 91精品国产综合久久香蕉| 国产亚洲一区二区三区不卡| 国产96在线 | 亚洲| 成人精品视频一区二区三区| 神马午夜精品91| 欧美美女bb生活片| 337p日本欧洲亚洲大胆鲁鲁| 日本免费在线精品| 亚洲综合福利| 欧美激情国产精品日韩| 97久久人人超碰| 亚洲第一精品在线观看| 亚洲精品第一国产综合精品| 成全电影大全在线观看| 国产乱码精品一区二区三区中文| 国内激情久久| 成年人小视频在线观看| 亚洲线精品一区二区三区八戒| 丰满人妻妇伦又伦精品国产| 高清在线视频日韩欧美| 欧美电影完整版在线观看| 免费看国产一级片| av电影天堂一区二区在线| 1级黄色大片儿| 亚洲精品丝袜日韩| 三上悠亚激情av一区二区三区 | 天天在线视频色| 成人网在线视频| 午夜欧美理论片| 一本色道久久hezyo无码| 亚洲午夜精品在线| 午夜福利视频一区二区| 国产激情视频一区| 久久理论电影| 日本黄色三级网站| 亚洲成人一区二区| 青青草免费在线| 国产欧美日韩专区发布| 中文字幕乱码亚洲无线精品一区| 国产成人精品一区二区三区在线观看 | 国产精品69毛片高清亚洲| 日本少妇xxxx动漫| 亚洲片在线资源| 91麻豆精品| 欧美精品久久久久久久自慰| 久久日一线二线三线suv| 一本一道人人妻人人妻αv| 欧美丰满少妇xxxx| 久久99国产精一区二区三区| 午夜视频在线网站| 亚洲成av人综合在线观看| 国产视频二区在线观看| 亚洲va久久久噜噜噜| 99精品视频免费全部在线| 国产美女永久免费无遮挡| 日韩一区二区三区四区| 成人小电影网站| 手机成人av在线| 91最新地址在线播放| 一级片aaaa| 68精品国产免费久久久久久婷婷| 欧美限制电影| 岛国精品一区二区三区| 欧洲精品在线观看| 四虎影视成人| 青青草原亚洲| 成人深夜在线观看| 亚洲一区精品在线观看| 久久男人的天堂| 久久中文字幕av| 特级西西人体wwwww| 日韩一区二区影院| 亚洲精品555| 97视频久久久| 亚洲视频资源在线| 国产三级视频在线看| 国产福利久久精品|