黑马程序员技术交流社区
标题:
通过反射执行某个类中的main方法的参数传递问题
[打印本页]
作者:
贾振凯
时间:
2013-2-24 15:56
标题:
通过反射执行某个类中的main方法的参数传递问题
在《自学视频------基础加强1》中对于该问题听得一知半解
说是通过反射获取包装有某个类的main方法的Method对象mainMethod以后,在调用mainMethod.invoke(null,①)
方法时①处若传递数组作为main方法参数,则数组会被拆包打散成若干个单独的参数,这个怎么理解?拆包是怎么一回事儿啊?
解决方法1:①处传入 newObject[]{new String[] {"XXXXX","XXXX",.....}}
解决方法2:①处传入( Object)new String[] {"XXXXX","XXXX",.....}
作者:
胥文
时间:
2013-2-24 17:59
就是编译器不认识数组只认识数组中的元素,而invoke中又只能传一个参数
当你传一个数组(数组的长度>1)这时候编译器就会报错
所以要么把数组作为一个整体传入到另一个数组中,要么把数组强制转换成一个对象,这样Invoke才识别
作者:
冯佩
时间:
2013-2-24 19:12
如何为invoke方法传递参数呢,按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,因为jdk1.5要兼容jdk1.4的语法,所以当把一个字符数组作为参数传递给invoke方法时,javac会按jdk1.4
的语法进行处理。不能使用代码:mainMethod.invoke(null,new String[]{"xxx"});解决方法一种是写成mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});//即封装成一个参数,另一种方法是写成:mainMethod.invoke(null,(Object)new String[]{"xxx"});//这样做等于告诉编译器说这是一个参数 ,编译器就不会把参数当数组看待,也不会把数组打散成若干个参数了.
作者:
侯丛政
时间:
2013-2-24 19:27
Method是底层方法的对象. 具体到底层不同的方法, 所需要传递的参数类型和个数也是不能确定(不一样)的, 而invoke是Method的方法, 为了简洁, 它没必要弄那么多重载的方法, 而只是把需要传递到底层方法的参数包装数组形式, 个别参数被自动解包,以便与基本形参相匹配.(这就是虚拟机的能力了)
作者:
吴硕
时间:
2013-2-24 19:54
本帖最后由 吴硕 于 2013-2-24 19:57 编辑
在Java1.4中还没有可变参数,所以Method的invoke方法为这样:
Object invoke(Object obj, Object[] args)
其中args表示参数列表,所以args中的每一个元素为一个参数
到了Java1.5有了可变参数,Method的invoke方法变成了这样:
Object invoke(Object obj, Object... args)
就不需要在传入Object数组了
但使用反射调用main方法时,如下:
mainMethod.invoke(null, new String[]{"2", "3", "4"});
传入了一个String类型的数组,就与1.4的调用方式吻合了,因为向下兼容的特性,并不会把args作为一个参数,而是会把args中的每个元素作为一个参数(就像1.4中处理的那样)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2