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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-3 10:21  /  1474 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast.one;
public class Two {
   private final String [] s;
   public Two(String [] s)
   {
   this.s=new String[s.length];
   for(int x=0;x<S.LENGTH;X++){
    this.s[x]=s[x];
   }
   }
  }
我用下面的方法反射Two这个类 ,先反射出他的构造函数,然后用这个构造函数创建对象
Class c=Class.forName("cn.it.cast.one.Two");
  Constructor cc=c.getConstructor(String [].class);
String [] s=new String []{"abc"};
  Object o=cc.newInstance(s);

结果报错了, 哪里错了,求解!!!

1 个回复

倒序浏览
这个问题要先说说Constructor 下面的newInstance方法了,
在JDK1.5之前,它的参数列表是(Object[] initargs)
JDK1.5加入了动态参数之后,它的参数列表变为(Object... initargs)

Object o=cc.newInstance(s);
你这里的s是String[]类型,因为String数组里的每个元素都是String类型的对象,
JVM会自动把s中的每个String元素拿来当作参数传递,
这样就相当于你传递的参数是一个String类型(你这的s里只有"abc")
而这与构造器public Two(String [] s)的参数列表明显不一致,结果就会报错了

解决办法:
1.Object o=cc.newInstance((Object)s);//强制类型转换,告诉JVM,我这儿传的就是一个String[]类型对象,不用拆箱
2.Object o=cc.newInstance(new Object[]{s});//把s作为Object[]数组中的一个元素传递,拆箱之后是String[]类型,正好满足

这些内容在张孝祥老师的教程中都有介绍,楼主应该好好看看视频
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马