前言
在Java 8之前的版本,代碼編譯為class文件后,方法參數(shù)的類型是固定的,但參數(shù)名稱卻丟失了,這和動態(tài)語言嚴(yán)重依賴參數(shù)名稱形成了鮮明對比?,F(xiàn)在,Java 8開始在class文件中保留參數(shù)名,給反射帶來了極大的便利。
示例:
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ù)名稱被編譯進了class文件,替代了早期版本里無意義的arg0
、arg1
……
對于很多依賴參數(shù)名的框架,可進一步簡化代碼:
1
2
3
4
|
@Path ( "/groups/:groupid/:userid" ) public User getUser(String groupid, String userid) { ... } |
沒有參數(shù)名的時代,得加上注解:
1
2
3
4
|
@Path ( "/groups/:groupid/:userid" ) public User getUser( @Param ( "groupid" ) String groupid, @Param ( "userid" ) String userid) { ... } |
遺憾的是,保留參數(shù)名這一選項由編譯開關(guān)javac -parameters
打開,默認是關(guān)閉的。
在Eclipse中,可以通過Compiler選項打開:
注意:此功能必須把代碼編譯成1.8版本的class才行。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
原文鏈接:http://www.liaoxuefeng.com/article/00141999088629621039ee8c4614579bfedb78a5030bce3000