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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 柏涛 中级黑马   /  2014-2-19 19:22  /  742 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

m.invoke(null,new Object[]{new String[]{"A","B","C"}})

为啥前面要加个object[]  求解

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

2 个回复

正序浏览
因为虚拟机会把{"A","B","C"}当成三个参数传递给方法,如果前面加上Object[]{}就把这个数组当成一个参数传递进去了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
这个是JDK1.4版本遗留的兼容性问题,高新视频中都有,这里再赘述一下吧
jdk1.4 和jdk1.5 的invoke方法的区别:
        1.5: public Object invoke(Object obj, Object...args)       
        1.4: public Object invoke(Object obj, Object[] args)       
        //按照1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中每个元素分别对应被调用方法中的一个参数
        //所以调用charAt方法可以用1.4的写法改为 methodCharAt.invoke("str", new Object[]{1}) 的形式

                按照1.5的语法,整个数组是一个参数,而在1.4中数组的每个元素对应一个参数(会自动拆包)
                1.5 为了兼容1.4,保留了该设定,所以在给main方法传递参数时,不能使用Method.invoke(null, String[]{...})
                因为编译器会将其按照1.4的语法进行编译,所以会出现"参数个数异常",这是1.4版本遗留的兼容性问题
        处理方法:
                Method.invoke(null, new Object[]{new String[]{"..."}});//1,相当于加一层皮,拆分一次
                Method.invoke(null, (Object)new String[]{"..."});//2,相当于声明为一个对象,不让编译器拆分

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

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