黑马程序员技术交流社区

标题: 一个关于反射的问题。 [打印本页]

作者: 陆旭东    时间: 2013-3-30 20:01
标题: 一个关于反射的问题。
对反射不太理解,希望高手讲解一下。尤其是一下这段对接收数组参数的成员方法进行反射的代码:
  1. String mainClassName=new String("MainClassName");
  2.   Method mainMethod=Class.forName(mainClassName).getMethod("main", String[].class);
  3.   mainMethod.invoke(null, new Object[]{new String[]{"Ling","Dong","Cao"}});
  4.   mainMethod.invoke(null, (Object)new String[]{"Ling","Dong","Cao"});
复制代码

作者: 谢波    时间: 2013-3-30 21:03
其实这个问题涉及到的是可变参数
Method的invoke方法最后一个参数是可变参数
public Object invoke(Object obj,Object... args)就相当于:invoke(Object obj,Object[] objs)
传new String过去就相当于:Object[] objs = new String[]{"Ling","Dong","Cao"};这个等式是成立的,objs.length=3
调用main方法时,就相当于让String[] args = objs;这个显然不行,所以jvm自动拆包将objs内的每个对象分别作为参数传递给main函数
这样就导致了,参数个数异常
也就是说传一个String数组,它会认为你传入了多个对象,即多个参数,但是我们只需要传入一个参数
所以,需要讲String数组变成一个对象,就ok了
最简单的方式就是用强转
作者: 秀川大人    时间: 2013-3-30 21:12
Method mainMethod=Class.forName(mainClassName).getMethod("main", String[].class);//这个方法是为了得到mainClassName这个类的main方法,这个方法的参数类型是String
mainMethod.invoke(null, new Object[]{new String[]{"Ling","Dong","Cao"}});//这行是调用Method的底层方法,调用main方法,应为main方法是静态的,所以不需要对象,即null,因为main方法得到参数时会拆开所传参数,因此用Object将参数包装起来,
作者: 陈丽莉    时间: 2013-3-30 23:42
若还有问题,继续追问;没有的话,将帖子分类改成【已解决】哦~  





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2