精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

中文字幕 国产精品| 爱爱免费小视频| 亚洲wwwww| 97se亚洲国产综合自在线观| 青草青草久热精品视频在线观看| 国产老熟女伦老熟妇露脸| 亚洲精品粉嫩美女一区| 一区二区三区在线视频免费观看 | 3d欧美精品动漫xxxx无尽| 国产精品免费免费| 国产亚洲一区二区三区在线播放| 成人免费视频国产免费| 综合激情网站| 亚洲色图17p| 日本人妻一区二区三区| 日本一区二区电影| 午夜精品一区二区三区电影天堂| 亚洲免费精品视频| 日韩在线观看视频一区| 另类调教123区| 69av在线视频| 手机在线免费看片| 国产一区二区三区天码| 日韩av影视在线| 在线播放黄色av| 欧美日韩成人影院| 亚洲www啪成人一区二区麻豆| 色狠狠久久av五月综合|| 色噜噜在线播放| 国产尤物一区二区在线| 国产精品久久久久久久天堂 | 98在线视频| 91丨九色丨蝌蚪富婆spa| 91久色国产| 一级做a爱片性色毛片| 噜噜爱69成人精品| 性亚洲最疯狂xxxx高清| 欧美日韩免费做爰视频| 99精品网站| 在线观看欧美视频| 播金莲一级淫片aaaaaaa| 高清欧美性猛交xxxx黑人猛| 日韩一区二区视频在线观看| 九色porny自拍| 中文字幕av一区二区三区佐山爱| 日韩欧美国产中文字幕| 国产精品333| 操喷在线视频| 亚洲国产视频网站| 国产乱子伦精品无码专区| 国产原厂视频在线观看| 综合欧美一区二区三区| 亚洲国产一区二区三区在线播| 日韩一区av| 91免费视频大全| 日本一区二区三区四区在线观看 | 九色精品美女在线| 欧美国产精品一二三| 伊人久久大香线蕉精品组织观看| 久久久精品日本| 久久高清内射无套| 欧美fxxxxxx另类| 九九综合九九综合| www.99re7.com| 国产美女一区| 国产精品 欧美在线| 中文字幕在线观看免费| 美女mm1313爽爽久久久蜜臀| 国产日韩精品在线播放| 99在线观看免费| 国产成人精品免费网站| 久久久久久艹| 国产高清一区在线观看| 亚洲三级免费电影| www.国产亚洲| 欧美激情网站| 欧美在线免费视屏| 欧美又黄又嫩大片a级| 91精品啪在线观看国产爱臀| 亚洲国产天堂久久综合网| 蜜桃精品一区二区| 久久精品av| 欧美国产日韩中文字幕在线| 久久精品国产成人av| 日韩精品久久久久久| 国产欧美精品在线播放| 亚洲精品第五页| 26uuu成人网一区二区三区| 亚洲一卡二卡三卡四卡无卡网站在线看 | 小说区视频区图片区| 男人添女人下部高潮视频在线观看 | 成人免费视频观看| 欧美成人bangbros| 亚洲精品国产熟女久久久| 亚洲国产精品久久久天堂| 久久久最新网址| 中文字幕乱码视频| 丁香亚洲综合激情啪啪综合| 欧美日韩在线观看一区| www免费在线观看| 懂色av影视一区二区三区| 国产 porn| 福利欧美精品在线| 中文字幕亚洲图片| 日韩精品手机在线| 国产一区激情在线| 日本午夜精品一区二区| 日韩三级电影视频| 欧美伊人精品成人久久综合97 | 中文字幕一区二区三区色视频| 亚洲色欲久久久综合网东京热| av成人在线观看| 亚洲精品ady| 欧美激情图片小说| 免费国产亚洲视频| 精品国产一区二区三区久久久久久| 男人影院在线观看| 色中色一区二区| www.四虎在线| 一区二区在线| 成人www视频在线观看| 青青草视频在线观看| 一区二区三区欧美在线观看| 亚洲久久中文字幕| 亚洲美女久久| 26uuu另类亚洲欧美日本老年| 99国产精品久久久久99打野战| 国产午夜亚洲精品午夜鲁丝片| 成人在线视频www| 日韩欧美中文第一页| 无码人妻aⅴ一区二区三区玉蒲团| 狠狠综合久久av一区二区蜜桃| 午夜精品久久久久久久久久久久 | 亚洲成人第一| 六月婷婷综合| 日韩精品在线观看一区| 国产精品不卡av| 成人性生交大片免费看中文网站 | 亚洲免费影院| 国产伦精品一区二区三区| 中文字幕有码在线观看| 欧美日韩的一区二区| 美女爆乳18禁www久久久久久| 日韩视频二区| 国产日韩精品一区观看| av影院在线免费观看| 精品人伦一区二区色婷婷| 中国毛片直接看| 久久精品国产第一区二区三区| 日产国产精品精品a∨| 成人在线爆射| 中国人与牲禽动交精品| 精人妻无码一区二区三区| 91老司机福利 在线| 欧美 日韩 国产一区| 天天久久夜夜| 国产精品99久久久久久白浆小说| 国产永久免费高清在线观看| 在线视频欧美精品| 又色又爽的视频| 久久99精品久久久| 免费久久久久久| 日韩在线成人| 97在线视频观看| 日韩欧美亚洲系列| 欧美性大战久久| www中文在线| 国产另类ts人妖一区二区| 久久久久久久香蕉| 亚洲精品一区二区三区在线| 91成人福利在线| 番号集在线观看| 91精品久久久久久久99蜜桃| 久久久久久久九九九九| 99国产精品久久久久久久久久久| 精品无码一区二区三区在线| 国产精品免费不| 成人a视频在线观看| 成人av影院在线观看| 亚洲男人的天堂网站| 精品乱码一区内射人妻无码| 亚洲品质自拍视频网站| 妖精视频一区二区| 日韩精品电影在线观看| 天天爱天天做天天操| 第一区第二区在线| 国产精品第一页在线| h视频在线免费观看| 亚洲经典中文字幕| ,一级淫片a看免费| 香蕉久久一区二区不卡无毒影院| 欧美特级黄色录像| 国产一区二区三区综合| 男女高潮又爽又黄又无遮挡| 日韩在线高清| 国产精品久久久久久久免费大片 | 51午夜精品国产| 欧美成人精品欧美一级乱黄| 中文欧美字幕免费| 捆绑裸体绳奴bdsm亚洲| 九九视频精品免费| 成人黄色片视频| 一区在线免费观看| 亚洲一区二区精品在线| 久久动漫网址| 亚洲r级在线观看| 88xx成人永久免费观看| 久久琪琪电影院| 免费a级在线播放| 亚洲男人天堂2023| 午夜精品久久久久久久91蜜桃| 91成人国产精品| 国产午夜在线播放| 亚洲一区在线观看免费| 午夜精品久久久久99蜜桃最新版| 99国产麻豆精品| 在线观看亚洲免费视频| 久久99日本精品| 国产精品亚洲a| 亚洲国产二区| 91精品国产毛片武则天| 久久香蕉国产| 日韩免费电影一区二区三区| 青青草原在线亚洲| 99视频免费观看蜜桃视频| 亚洲男人在线| 国产精品视频区1| 天堂久久午夜av| 国产成+人+综合+亚洲欧洲| 99在线视频影院| 欧美夫妻性视频| av香蕉成人| 日韩一级黄色av| 午夜激情视频在线| 一区二区中文字幕| 福利片在线观看| 亚洲人免费视频| 久草福利在线视频| 国产视频精品在线| 人成在线免费视频| 亚洲奶大毛多的老太婆| 青青操在线视频| 亚洲免费人成在线视频观看| 天堂在线中文| 日韩电影大片中文字幕| 人妻一区二区三区四区| 亚洲电影中文字幕| 天天摸天天干天天操| 亚洲国产欧美一区二区丝袜黑人| 人妻少妇一区二区三区| 日韩av在线直播| 色哟哟在线观看| 亚洲性69xxxbbb| 日本免费在线视频| 欧美成人三级视频网站| 自拍亚洲图区| 97精品一区二区视频在线观看| aa视频在线观看| 清纯唯美日韩制服另类| 亚洲www啪成人一区二区| 国产精品黄色av| 欧美亚洲人成在线| 18成人免费观看网站下载| 成人高潮a毛片免费观看网站| 国产中文一区二区| 国产剧情一区| 资源网第一页久久久| 一本一本久久a久久综合精品| 艳母动漫在线观看| 红桃视频欧美| 国产亚洲天堂网| 久久精品国产精品亚洲红杏 | 国产精品视频久久久久久| 欧美一区二区日韩一区二区| 国产小视频免费观看| 亚洲欧美国产日韩中文字幕| 97人人在线| 欧美韩国理论所午夜片917电影| 韩国久久久久久| 91久久久久久久久久久久久| 国产调教精品| 日韩电影大全在线观看| 欧美日韩网址| 中文字幕无码不卡免费视频| 黑人巨大精品欧美黑白配亚洲| 天天躁日日躁狠狠躁av| 国产精品污www在线观看| 黄色在线观看免费| 91成人在线精品| 性生交生活影碟片| 在线午夜精品自拍| 成人在线免费观看黄色| 国产精品久久久久久久7电影| 91精品网站在线观看| 久久99热只有频精品91密拍| 亚洲激情中文在线| 欧美性大战久久久久xxx| 国内精品伊人久久久久av一坑| 99re久久精品国产| 中文字幕欧美一| 伊人中文字幕在线观看| 欧美一区二区福利视频| 第九色区av在线| 午夜精品一区二区三区在线播放| www久久久| 日本在线播放不卡| 亚洲福利电影| 午夜激情视频网| 日本一区二区综合亚洲| 国产精品老女人| 日韩欧美中文字幕精品| 在线免费观看黄色网址| 欧美又大粗又爽又黄大片视频| 91成人短视频| 黄色网络在线观看| 蜜臀av国产精品久久久久| 成人精品999| 亚洲一二三区不卡| av网站在线观看免费| 在线播放日韩专区| 中文字幕在线看片| 国产区一区二区| 好吊视频一区二区三区四区| 国产传媒免费观看| 国产精品久久久爽爽爽麻豆色哟哟 | 精品成人一区| 亚洲男人天堂2021| 国产精品污网站| 中文字幕久久久久| 亚洲丝袜在线视频| 成人福利视频| 欧美午夜欧美| 久久一区国产| 亚洲性猛交xxxx乱大交| 欧美日韩国产中文精品字幕自在自线| 动漫av一区二区三区| 欧美肥婆姓交大片| jizzjizzjizz欧美| 国产情侣第一页| 成人免费视频网站在线观看| 精品无码av在线| 精品奇米国产一区二区三区| 国产盗摄在线视频网站| 国产精品久久久久久久免费大片| 亚洲国产高清视频| 在线免费观看污视频| 天天综合天天综合色| 亚洲av成人精品日韩在线播放| 96精品视频在线| 九九久久精品| 国产一级特黄a大片免费| 中文字幕欧美区| 在线观看中文字幕码| xxxxxxxxx欧美| 国产亚洲精aa在线看| 日韩中文在线字幕| 福利一区二区在线| 日韩欧美三级在线观看| 亚洲精品一区二区三区婷婷月| xxx欧美xxx| 先锋影音一区二区三区| 黄色精品一二区| 久久久久久久久97| 精品一区二区三区四区| 久久99国产精品二区高清软件| 在线成人av电影| 国产成人99久久亚洲综合精品| 国产一级在线播放| 亚洲日韩欧美视频一区| 黄色成人小视频| 毛片在线视频观看| 97se亚洲国产综合自在线| 中文字幕 日韩有码| 欧美精品少妇videofree| 欧美成人基地| 亚洲欧美在线精品| 亚洲一级不卡视频| 九色在线播放| 91在线网站视频| 噜噜噜躁狠狠躁狠狠精品视频| 中国1级黄色片| 精品乱码亚洲一区二区不卡| 亚洲美女炮图| 咪咪色在线视频| 91在线观看下载| 91在线公开视频| 性亚洲最疯狂xxxx高清| 久久免费精品视频在这里| 成人在线观看一区二区| 欧美影视一区二区三区| 免费在线观看的电影网站| 欧美亚洲丝袜| 国产精品538一区二区在线| 国产成人一级片| 久久综合免费视频| 美女毛片一区二区三区四区| www.欧美com| 欧美三区在线观看| yellow在线观看网址| 正在播放一区二区三区|