前言
在Java 8之前的版本,代碼編譯為class文件后,方法參數(shù)的類型是固定的,但參數(shù)名稱卻丟失了,這和動(dòng)態(tài)語(yǔ)言嚴(yán)重依賴參數(shù)名稱形成了鮮明對(duì)比。現(xiàn)在,Java 8開(kāi)始在class文件中保留參數(shù)名,給反射帶來(lái)了極大的便利。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class GetRuntimeParameterName { public void createUser(String name, int age, int version) { // } public static void main(String[] args) throws Exception { for (Method m : GetRuntimeParameterName. class .getMethods()) { System.out.println( "----------------------------------------" ); System.out.println( " method: " + m.getName()); System.out.println( " return: " + m.getReturnType().getName()); for (Parameter p : m.getParameters()) { System.out.println( "parameter: " + p.getType().getName() + ", " + p.getName()); } } } } |
Method.getParameters
為1.8新增方法,可以獲取參數(shù)信息,包括參數(shù)名稱。
上述代碼輸出的createUser
參數(shù)如下:
1
2
3
4
5
|
method: createUser return : void parameter: java.lang.String, name parameter: int , age parameter: int , version |
參數(shù)名稱被編譯進(jìn)了class文件,替代了早期版本里無(wú)意義的arg0
、arg1
……
對(duì)于很多依賴參數(shù)名的框架,可進(jìn)一步簡(jiǎn)化代碼:
1
2
3
4
|
@Path ( "/groups/:groupid/:userid" ) public User getUser(String groupid, String userid) { ... } |
沒(méi)有參數(shù)名的時(shí)代,得加上注解:
1
2
3
4
|
@Path ( "/groups/:groupid/:userid" ) public User getUser( @Param ( "groupid" ) String groupid, @Param ( "userid" ) String userid) { ... } |
遺憾的是,保留參數(shù)名這一選項(xiàng)由編譯開(kāi)關(guān)javac -parameters
打開(kāi),默認(rèn)是關(guān)閉的。
在Eclipse中,可以通過(guò)Compiler選項(xiàng)打開(kāi):
注意:此功能必須把代碼編譯成1.8版本的class才行。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
原文鏈接:http://www.liaoxuefeng.com/article/00141999088629621039ee8c4614579bfedb78a5030bce3000