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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涐扪①起奮乧 中级黑马   /  2013-12-1 21:54  /  1120 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 涐扪①起奮乧 于 2013-12-2 17:09 编辑

用反射执行某个main方法的时候在为invoke()方法传递参数的时候,引文涉及到一个
jdk版本的问题,新版本要兼容老版本,看视频里面讲到在给main方法传递参数时,不能使用
mainMethod.invoke(null,new String[]{"XXX"});javac只把它当成jdk1.4的语法进行理解,而不把它当成
jdk1.5的版本进行理解,因此会出现参数类型不对的问题。

关于给出的两种解决方案

第一种:mainMethod.invoke(null,(Object)new String[]{"XXX"});此种解决方式
会针对(Object)特别标注的这一块做特殊处理,编译时不把参数当成数组看待,也就不会把数组打散成若干个


我的疑问在于第二种方式:

第二种方式:mainMethod.invoke(null,new Object[]{new String[]{"XXX"}});
编译时jdk1.5会自动拆箱,即把Object[]这一块给拆掉,里面剩下new String[]{"XXX"}把这一块当成一个整体,就不会出现类型不对问题了。

但是为什么只拆箱一次?不能拆箱两次吗?或者拆箱n次。是java规定只拆箱一次的吗?

关于网络拆包,每一层只拆自己对应的包,这一块还好理解,上面例子中的拆包跟网络拆包类似吗?

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

1 个回复

正序浏览
对接收数组参数的成员方法进行的反射,其接收的只能是个数组,如果是new String[""],1.4会把它打散成一个个的去处理,而1.5兼容1.4的语法,所以在接收这种类型的数组时 ,必须把它打包成一个对象或对象数组,这样就不会出现在invoke方法时,提示参数个数不同的错误。
第一种方式:mainMethod.invoke(null,new Object[]{new String[]{"XXX"}});//将字符串数组作为object数组的一个元素。
第二种方法:mainMethod.invoke(null,(Object)new String[]{"XXX"});//此时,编译器会作特殊处理,编译时不把参数当做数组看待,也就不会数组打散成若干个参数了。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马