使用Java8獲取方法引數名稱
阿新 • • 發佈:2019-02-17
在Java 8之前的版本,程式碼編譯為class檔案後,方法引數的型別是固定的,但引數名稱卻丟失了,這和動態語言嚴重依賴引數名稱形成了鮮明對比。現在,Java 8開始在class檔案中保留引數名,給反射帶來了極大的便利。
示例:
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新增方法,可以獲取引數資訊,包括引數名稱。
上述程式碼輸出的createUser
引數如下:
method: createUser
return: void
parameter: java.lang.String, name
parameter: int, age
parameter: int, version
引數名稱被編譯進了class檔案,替代了早期版本里無意義的arg0
arg1
……
對於很多依賴引數名的框架,可進一步簡化程式碼:
@Path("/groups/:groupid/:userid")
public User getUser(String groupid, String userid) {
...
}
沒有引數名的時代,得加上註解:
@Path("/groups/:groupid/:userid")
public User getUser(@Param("groupid") String groupid, @Param("userid") String userid) {
...
}
遺憾的是,保留引數名這一選項由編譯開關javac -parameters
開啟,預設是關閉的。
在Eclipse中,可以通過Compiler選項開啟:
注意此功能必須把程式碼編譯成1.8版本的class才行。