天天看點

java冷知識:Java 8 Reflection通路方法參數

在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架構源碼的童靴也一定知道,它肯定有通路方法的參數名的需求,那它是如何解決的呢?它采用了讨巧的方式,在參數名前指定注解加以解決,當然這也不是為一種比較好的方式。

java冷知識:Java 8 Reflection通路方法參數
public String info(@RequestParam(value="key") String key) {
} 
           

參閱資料

Java8 Reflection Access to Parameter Names of Method