黑马程序员技术交流社区
标题:
可变参数的反射疑问
[打印本页]
作者:
柏涛
时间:
2014-2-19 19:22
标题:
可变参数的反射疑问
m.invoke(null,new Object[]{new String[]{"A","B","C"}})
为啥前面要加个object[] 求解
作者:
joure
时间:
2014-2-19 20:16
这个是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,相当于声明为一个对象,不让编译器拆分
作者:
唐宋元明清
时间:
2014-2-19 21:58
因为虚拟机会把{"A","B","C"}当成三个参数传递给方法,如果前面加上Object[]{}就把这个数组当成一个参数传递进去了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2