A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在《自学视频------基础加强1》中对于该问题听得一知半解

说是通过反射获取包装有某个类的main方法的Method对象mainMethod以后,在调用mainMethod.invoke(null,①)
方法时①处若传递数组作为main方法参数,则数组会被拆包打散成若干个单独的参数,这个怎么理解?拆包是怎么一回事儿啊?
解决方法1:①处传入 newObject[]{new String[] {"XXXXX","XXXX",.....}}
解决方法2:①处传入( Object)new String[] {"XXXXX","XXXX",.....}

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
就是编译器不认识数组只认识数组中的元素,而invoke中又只能传一个参数
当你传一个数组(数组的长度>1)这时候编译器就会报错
所以要么把数组作为一个整体传入到另一个数组中,要么把数组强制转换成一个对象,这样Invoke才识别
回复 使用道具 举报
如何为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"});//这样做等于告诉编译器说这是一个参数 ,编译器就不会把参数当数组看待,也不会把数组打散成若干个参数了.
回复 使用道具 举报
Method是底层方法的对象.  具体到底层不同的方法, 所需要传递的参数类型和个数也是不能确定(不一样)的,  而invoke是Method的方法, 为了简洁, 它没必要弄那么多重载的方法, 而只是把需要传递到底层方法的参数包装数组形式,  个别参数被自动解包,以便与基本形参相匹配.(这就是虚拟机的能力了)
回复 使用道具 举报
本帖最后由 吴硕 于 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中处理的那样)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马