但是引用数据类型就不同了,因为要向前兼容,所以在调用带有可变参数的方法时,如果是引用类型,vm会在运行时做一些小动作。
如果你是以多个常量的形式传入实际参数,那没问题,但是,如果你想以数组的形式向其中传递一个参数集,那问题就来了,数组必须是Object类型的数组,如果不是,数组当中的内容会被拆解,每一个元素都会被当作一个Object[]类型,这样就会出现参数个数的错误,所以想要以数组的形式向可变参数的方法中传值的时候要进行Object保护,即把你的数组强制转换成Object类型,这样vm就被你骗过了,他会说:哦,已经是Object[]类型了,那把里面的元素都拿出来吧。
请看下面的例子:
public static void func(String...x){
System.out.println(Arrays.asList(x));
}
如果这样调用:
Method mth = Test1.class.getMethod("func", String[].class);
mth.invoke(null, new String[]{"a","b"});
那么,你会得到这个
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at test.Test1.main(Test1.java:24)
所以,必须对String数组进行包装
Method mth = Test1.class.getMethod("func", String[].class);
mth.invoke(null, (Object)new String[]{"a","b"});
或
mth.invoke(null, new Object[]{new String[]{"a","b"}});
这样就会得到正确的值。