在java中使用Reflection API擷取構造方法或普通方法的參數名是一件比較麻煩的事情,而Java 8提供java.lang.reflect.Parameter類,它将提供有關參數名稱及其修飾符的資訊。在Java 8之前,我們不能直接擷取方法或構造函數的參數名。當然,額外的有一個友善的方法Parameter.isNamePresent() 來驗證參數名是不是可用。
public class BookService {
public void buildBook(String bookName, Integer bookPrice) {
}
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
Method[] methods = BookService.class.getDeclaredMethods();
for (Method method : methods) {
for (Parameter p : parameters) {
System.out.println("f1: "+p.getName());//輸出:arg0、arg1
if (p.isNamePresent()) {//一直為false
System.out.println(p.getName());
}
}
}
}
這時候你會問怎麼破?
解決方法1
既然方法名是在編譯後丢失的,那能不能可以不讓它丢失呢!當時是有的,可以通過 javac -parameters 指令解決。如果在maven項目中可以通過指定:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
解決方法2
熟悉spring架構源碼的童靴也一定知道,它肯定有通路方法的參數名的需求,那它是如何解決的呢?它采用了讨巧的方式,在參數名前指定注解加以解決,當然這也不是為一種比較好的方式。
public String info(@RequestParam(value="key") String key) {
}
參閱資料
Java8 Reflection Access to Parameter Names of Method