invoke(new int[])运行时会不会把里面的数组拆开
public static void test1() throws Exception{Class clazz = Class.forName("javaWeb.Person");
Method method = clazz.getMethod("main", String [].class);
method.invoke(null,(Object)new String[] {"aa","bb"});
}
public static void test2() throws Exception{
Class clazz = Class.forName("javaWeb.Person");
Method method = clazz.getMethod("run", int [].class);
method.invoke(null,new int[] {1,5});
}
上面两个函数中的invoke方法为什么new String[]前面要加一个(Object),而new int[]前面不用啊??
----------------解决方案--------------------------------------------------------
有吗?
可以不加的啊
在参数前加类型是转型用的,object任意类型都可以,加和不加没有什么区别吧,不知道说的对不对
----------------解决方案--------------------------------------------------------
回复 2楼 java小蚂蚁
如果method.invoke(null,(Object)new String[] {"aa","bb"}); 中不加上那个(Object),编译后会出现参数个数不匹配错误,也就是说会把那个String数组拆开里面有两个字符串即编译器会认为传了两个参数,故要把它转成Object类型编译器就不会去把它拆开,但不知道为什么下面的int类型的就不用这样也能编译 ----------------解决方案--------------------------------------------------------
回复 2楼 java小蚂蚁
我发现每次我在这里问问题都是你回答我,谢谢啊!!非常感谢!! ----------------解决方案--------------------------------------------------------
你的jdk版本是多少,我的不会啊,我的是6的。只是个警告而已。无所谓的。这个方法里的参数是可以任意型和个数的,一般不会出现你的问题,你看下是不是jdk的问题,
另外不客气。能帮到你很高兴
----------------解决方案--------------------------------------------------------
我的也是6的,会出现这个问题,我是看张孝祥老师的视频他是讲new String[]前面要加(Object),但不知道为什么int的就不加也能编译
----------------解决方案--------------------------------------------------------
我的6编译也没有报错
----------------解决方案--------------------------------------------------------
回复 7楼 ghjsmzy
如果我把(Object)去掉就会出现如下错误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:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at JavaWeb.methodTest1.test1(methodTest1.java:15)
at JavaWeb.methodTest1.main(methodTest1.java:9)
----------------解决方案--------------------------------------------------------
我查了一下觉得应该是int是基本类型转换成功,而String不是基本类型,在转换时出错了,而报wrong number of arguments错误,所以需要加(Object)做人工转换。
API中有这个方法的使用说明,其参数类型就是Object
invoke(Object obj, Object... args)
Invokes the underlying method represented by this Method object, on the specified object with the specified parameters.
然后,你看一下这个连接,对你应该也有帮助http://wenwen.soso.com/z/q188672163.htm
----------------解决方案--------------------------------------------------------
回复 9楼 ghjsmzy
根据你说的让我觉得应该是invoke()接收的第一个参数是Object类型,String就已经是Object型,String[]就相当于一个Object类型的数组,编译时遇到数组就会把数组中的数据拆开来,因此里面就有2个数据就会出现个数不匹配,而int不是Object型,int[]才是Object型,传一个int[]即传一个Object,已经是Object型了就不会再拆了,所以也就是只传了一个参数,你觉得我这样理解有道理吗? ----------------解决方案--------------------------------------------------------