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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陆旭东 中级黑马   /  2013-3-30 20:01  /  1255 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对反射不太理解,希望高手讲解一下。尤其是一下这段对接收数组参数的成员方法进行反射的代码:
  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"});
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
其实这个问题涉及到的是可变参数
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了
最简单的方式就是用强转

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
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将参数包装起来,

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问;没有的话,将帖子分类改成【已解决】哦~  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马