JDK5之後,java的方法定義多了一個可變參數(varargs),在某些場合下還是比較方便的。
但是,在通過反射(reflect)調用時,就遇到了一些問題。
主要體現在兩個方面:
1、如何根據方法名及參數類型精確地從一個Class中獲取Method實例?(參數類型是什麼?怎麼構造?)
2、invoke調用時的Args如何構造?
Google了一下,做了一個小例子。
另外,還有一個相關的技巧。考慮這個需求:
給定一個字符串,描述了一個方法調用過程,比如:
leo.language.VarargsTest#test#java.lang.String#java.lang.String#hi there#leo
或者
leo.language.AnotherTest#execute#java.lang.Integer#java.lang.String#25#leo
如何根據這些字符串重新執行對應的方法?
肯定是可以通過一個統一的工具來實現的,實現時,重點依然是在上面的兩個方面,如何構造method的parameter type和argument value。
對於問題一, 可以考慮:
List<Class> clazz = new ArrayList<Class>();
clazz.add(...);
xxx.class.getMethod("methodName", clazz.getClass());
問題二比較簡單,就不說了。