日期:2014-05-20  浏览次数:20689 次

反射方法的参数是数组时遇到的问题
JDK1.5出现了可变参数后,Method的invoke方法就从method.invoke(Object obj,Object[] obj);变成了invoke(Object obj,Object...obj)

为了向下兼容,如果传递给Method.invoke的第二个参数是一个数组,编译器会将数组拆开再根据数组里的数据查找要执行的方法

例如:反射main方法,main方法接收的是一个字符串参数

如果直接
@Test
public void test7() throws Exception{
Class clazz = Class.forName("peng.Demo.Person1");
Person1 p = (Person1) clazz.newInstance();
Method method = clazz.getMethod("main", String[].class);
method.invoke(p, new String[]{"一","二"});
}


这样会提示找不到main方法,因为给invoke的是一个字符串数组,在方法执行会将数组拆为"一","二",再寻找接收两个字符串的main方法,这样就找不到main了,因为我们的main方法接收的是一个字符串数组


我原本以为是所有的数组都会把他拆开再调用相应的方法,但现在发现如果接收的是一个基本数据类型的数组是不会拆开的
//	public void arrayDemo(int[] num)
@Test
public void test7() throws Exception{
Class clazz = Class.forName("peng.Demo.Person1");
Person1 p = (Person1) clazz.newInstance();
Method method = clazz.getMethod("arrayDemo", int[].class);
method.invoke(p, new int[]{1,2,3});
}


这样可以正确的执行。。。


现在有个疑问,为什么基本数据类型的数组参数虚拟机就不会认为是多个参数的封装把他拆开呢?
------解决方案--------------------
基本数据类型并不是一个Object,jdk1.5以后的可变参数对它不做打散。楼主要调main(String[] args)方法
可以这样做
method.invoke(p, (Object)new String[]{"一","二"});
加Object转型告诉编译器我这个就是一个Object不要给我打散.
或者
method.invoke(p, new Object[]{new String[]{"一","二"}});
你不是会打散吗,我在包成Object[]你打散了里面还是一个String[]