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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常万 中级黑马   /  2012-5-13 17:52  /  1896 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
这两种实例化对象在反射里面有什么区别?求高手!!!
第二种方式我运行程序会报错...

5 个回复

倒序浏览
第二种需要你的Person类有无参的构造函数  否则会报错
回复 使用道具 举报
第二种是第一种的简化方式,并且用第二种反射方法实例化类必须是无参的
回复 使用道具 举报

回帖奖励 +10

首先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();
   }
这样应该可以
回复 使用道具 举报
Person类里你没无参构造函数 你让他反射得到他 他没有你得不到 所以就报错了!!
回复 使用道具 举报
冯建鹏 发表于 2012-5-13 22:46
首先p = (Person)c1.newInstance();这句话实例的是无参数的对象,如果有参数的话需要得到字节码文件的构造 ...

呵呵~~我昨天通过查API调试解决了:lol不过还是谢谢哥们·~情况就是你说的这个情况:victory:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马