1. 程式人生 > >使用Java8獲取方法引數名稱

使用Java8獲取方法引數名稱

在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才行。