黑马程序员技术交流社区
标题:
反射一个类中的main方法出错
[打印本页]
作者:
java陈辉
时间:
2013-12-8 21:10
标题:
反射一个类中的main方法出错
本帖最后由 java陈辉 于 2013-12-9 20:05 编辑
public class Person {
public static void main(String[] args){
System.out.println("mian");
}
}
public class ReflectDemo{
public static void main(String[] args) throws Exception {
demo1();
}
private static void demo1() throws Exception {
Class clazz=Class.forName("cn.itcast.bean.Person");
Method method=clazz.getMethod("main",String[].class);
method.invoke(null, new String[]{"aa","bb"});
}
}
为什么通过反射调用Person类中的main方法会报错,提示:Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments,求解释。
作者:
hel
时间:
2013-12-8 21:29
method.invoke(null, new String[]{"aa","bb"});
将这句话改为其中一句:
method.invoke(null, (object)new String[]{"aa","bb"}); //转换为对象
method.invoke(null, new object[]{new String[]{"aa","bb"}}); // 在包一个数组
为了兼容jdk1.4他在对数组进行解包,也就是“aa”,“bb”;
所有我们可以对其在包成一个数组,还可以将这个数组转换成一个对象,
作者:
谢文斌
时间:
2013-12-8 22:01
1楼说得很清楚了,这是因为java是向下兼容的,在1.4版本中还没有出现可变参数,所以java采用数组方法将未知的参数变量打包。你写的new String[]{"aa","bb"}会拆开来的。所以得把要传入的数组也打包成一个参数。方法就是:
method.invoke(null, (object)new String[]{"aa","bb"}); //转换为对象
method.invoke(null, new object[]{new String[]{"aa","bb"}}); // 把数组打包一下
作者:
§傻、才乖
时间:
2013-12-8 22:48
method.invoke(null, new String[]{"aa","bb"});
这名话不对
java在1.5以后才出的可变参数,为了兼容之前的
在传入一个数组时,默认是会解包的,在这句话中就是将数组已经拆成了字符串
有两种方式解决
1.
method.invoke(null, new Object[]{new String[]{"aa","bb"}});//将String 数组放到 Object数组
2.
method.invoke(null, (Object)new String[]{"aa","bb"});//将数组转换成Object对象
这样做是告诉JVM我传入的是一个对象,那么JVM在运行时就不会将它拆开
作者:
┾——黑马
时间:
2013-12-9 10:12
方式一:method.invoke(null, (object)new String[]{"aa","bb"}); 这种方式就是告诉JVM我传入的是一个对象,你不需要拆包了。
方式二:method.invoke(null, new object[]{new String[]{"aa","bb"}});
这种方式是外面再包一层object数组。
之所以要这样,是因为可变参数是jdk1.5的新特性,但是同时又要兼容1.4的老特性。所以才会出现这样的问题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2