黑马程序员技术交流社区

标题: 两种实例化在反射里面有什么区别??? [打印本页]

作者: 常万    时间: 2012-5-13 17:52
标题: 两种实例化在反射里面有什么区别???
public static void main(String[] args)throws Exception {
  // TODO Auto-generated method stub
  
  Class<?> c1 = null;//声明一个Class对象
  try {
   c1 = Class.forName("cn.itcast.test.Person");//实例化Class对象
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  Person p = null;//声明一个Person对象
  //通过反射取得Class中所有的构造方法
  Constructor<?> cons[] = c1.getConstructors();
  //调用构造函数
  try {
   
   p = (Person)cons[0].newInstance("小忽悠",23);
   //p = (Person)c1.newInstance();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
以上是部分代码,
   p = (Person)cons[0].newInstance("小忽悠",23);
   p = (Person)c1.newInstance();
这两种实例化对象在反射里面有什么区别?求高手!!!
第二种方式我运行程序会报错...

作者: 枫雨叶话    时间: 2012-5-13 17:55
第二种需要你的Person类有无参的构造函数  否则会报错
作者: 张晨    时间: 2012-5-13 18:08
第二种是第一种的简化方式,并且用第二种反射方法实例化类必须是无参的
作者: 冯建鹏    时间: 2012-5-13 22:46
首先p = (Person)c1.newInstance();这句话实例的是无参数的对象,如果有参数的话需要得到字节码文件的构造函数,通过getConstruct(参数...)参数是构造函数里面的类型加上.class因为每个类型都有一个.class对象。
  Person p = null;//声明一个Person对象
   //通过反射取得Class中所有的构造方法
   Constructor cons= c1.getConstructor(String.class,int.class);
   //调用构造函数
   try {
   
    p = (Person)consnewInstance("小忽悠",23);
    //p = (Person)c1.newInstance();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
这样应该可以
作者: 抓哇    时间: 2012-5-13 23:00
Person类里你没无参构造函数 你让他反射得到他 他没有你得不到 所以就报错了!!
作者: 常万    时间: 2012-5-14 08:42
冯建鹏 发表于 2012-5-13 22:46
首先p = (Person)c1.newInstance();这句话实例的是无参数的对象,如果有参数的话需要得到字节码文件的构造 ...

呵呵~~我昨天通过查API调试解决了:lol不过还是谢谢哥们·~情况就是你说的这个情况:victory:




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