使用反射操作對象-調用可變參數方法
要把可變參數都當做是其對應的數組類型參數;
如 show(XX... is)作為show(XX[] is)調用;
若可變參數元素類型是引用類型:
JDK內部接收到參數之后,會自動拆包取出參數再分配給該底層方法,為此我們需要把這個數組實參先包裝成一個Object對象或把實際參數作為一個Object一維數組的元素再傳遞。
若可變參數元素類型是基本類型:
JDK內部接收到參數之后,不會拆包,所以可以不必再封裝.不過封裝了也不會錯.所以建議,不管基本類型還是引用類型都使用Object[]封裝一層,保證無誤.
例子
package junereflect624;
//可變參數的方法調用
import java.lang.reflect.Method;
class VaryMethod{
public static void show(int ...args){
System.out.println("基本數據類型傳遞過來了!");
}
/*public static void show(int[] args){//這是一樣的
}*/
public static void show(String ...args){
System.out.println("引用數據類型傳遞過來了!");
}
}
public class InvokeVaryDemo10 {
public static void main(String[] args) throws Exception{
Class<VaryMethod> c = VaryMethod.class;
Method m = c.getMethod("show",int[].class);
m.invoke(null,new int[]{1,2,3});
m = c.getMethod("show",String[].class);
//m.invoke(null,new String[]{"A","B","C"});//ERROR
m.invoke(null,(Object)new String[]{"A","B","C"});//YES,強轉為Object類型
m.invoke(null,new Object[]{new String[]{"A","B","C"}});//推薦寫法
}
}