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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 皮卫凯 中级黑马   /  2012-9-20 17:44  /  4160 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 皮卫凯 于 2012-9-20 18:20 编辑

package Reflect;
  
class Person{
      
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
   
    public String toString(){
       return "["+this.name+"  "+this.age+"]";
    }
    private String name;
    private int age;
}


class hello{
    public static void main(String[] args) throws Exception
   {
        Class<?> demo=null;
        demo=Class.forName("Reflect.Person");
        Person per=null;
        per=(Person)demo.newInstance();    //创建一个Class对象  Person类的新实例
        per.setName("Rollen");
        per.setAge(20);
        System.out.println(per);
    }
}

Person中有个默认的无参构造函数,那为什么我自己定义个构造函数就会出错
public Person(String name, int age) {
        this.age=age;
        this.name=name;
    }


报错:
java.lang.InstantiationException: Reflect.Person
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    at Reflect.hello.main(hello.java:39)
Exception in thread "main" java.lang.NullPointerException
    at Reflect.hello.main(hello.java:47)

我利用的是Class实例化Person类的对象,
请问Person类中需要定义无参构造函数,还是有参构造函数,还是不用定义,自带有默认的隐式构造函数。



QQ截图20120920181844.jpg (64.29 KB, 下载次数: 92)

newInstance

newInstance

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
急啊,反射卡在这,后面的反射还没学呢,跪求大神{:soso_e200:}
回复 使用道具 举报
类中都有默认的无参构造函数,如果你定义了一个构造函数,它会覆盖掉无参的构造函数
回复 使用道具 举报
黑马张涛 发表于 2012-9-20 18:23
类中都有默认的无参构造函数,如果你定义了一个构造函数,它会覆盖掉无参的构造函数 ...

这个我知道,但我自定义一个有参构造函数,为什么会出错呢?
回复 使用道具 举报
你是不是用了有参的构造函数覆盖掉了无参的构造函数之后,还用这一句: per=(Person)demo.newInstance();  创建person的实例?
newInstance默认调用无参的构造函数创建对象,那里现在没有无参的构造函数,它调用谁呢?
这时你可以在自己定义一个无参的构造函数就可以了!
或者你通过反射先拿到有参的构造函数,再通过这个构造函数创建对象!

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黑马张涛 发表于 2012-9-20 18:37
你是不是用了有参的构造函数覆盖掉了无参的构造函数之后,还用这一句: per=(Person)demo.newInstance();   ...

赞一个,我懂了。 :victory:
回复 使用道具 举报
你定义了带有参数的构造方法,用反射创建对象的时候,就不能用Class的方法newInstance()去创建对象了,因为他是默认的去创建无参的构造方法
这时候你就应该Person.class.getConstrucor(具体参数自己传).newInstance(具体参数自己传);是先得到相应的构造方法的类在相应用它的newInstance()这个方法去创建实例对象
回复 使用道具 举报
newInstance();  是通过无参构造来实例话的, 如果你类里面没有定义任何构造方法的话, jvm会自动去找无参构造,如果这个时候你在类里面定一个有参构造的话,jvm就会去找那个有参构造,为了避免这个错误再把无参构造加上。
回复 使用道具 举报
黄敏 中级黑马 2012-9-21 08:52:51
9#
本帖最后由 黄敏 于 2012-9-21 09:17 编辑

package Reflect;
  
class Person{
      
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
   
    public String toString(){
       return "["+this.name+"  "+this.age+"]";
    }
    private String name;
    private int age;
}


class hello{
    public static void main(String[] args) throws Exception
   {
        Class<?> demo=null;
        demo=Class.forName("Reflect.Person");
        Person per=null;
       // per=(Person)demo.newInstance();        //你这一句是调用的Class对象中NewInstance()方法,而这个方法默认调用的是你Person类中的无参构造方法,因为你的Person类中已经定义了有参构造方法 这个有参构造就会代替无参构造初始化Person类 ,但是程序回去找无参构造没有找到,这就起冲突了 就报错了

       //下面的就是通过构造方法的对象获得有参构造方法  实例化Person对象并穿进去俩个参数;
       Conctructor cons = dom.getConstructor(String.class,Integer.class)               //使用的方法   [size=-1]Constructor<T>     getConstructor(Class<?>... parameterTypes)  返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
      
per =(Person) cons.newInstance("lishi", 21)                                                  //使用的方法   [size=-1] TnewInstance(Object... initargs)  使用此 Constructor 对象表示的                                                            构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
       // per.setName("Rollen");
       // per.setAge(20);
        System.out.println(per);
    }
}

Person中有个默认的无参构造函数,那为什么我自己定义个构造函数就会出错
public Person(String name, int age) {
        this.age=age;                                                                                             你这个Person构造函数在Person中吗?
        this.name=name;
    }
  

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马