黑马程序员技术交流社区

标题: 反射中,通过无参构造实例化对象。 [打印本页]

作者: 皮卫凯    时间: 2012-9-20 17:44
标题: 反射中,通过无参构造实例化对象。
本帖最后由 皮卫凯 于 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, 下载次数: 87)

newInstance

newInstance

作者: 皮卫凯    时间: 2012-9-20 18:16
急啊,反射卡在这,后面的反射还没学呢,跪求大神{:soso_e200:}
作者: 黑马张涛    时间: 2012-9-20 18:23
类中都有默认的无参构造函数,如果你定义了一个构造函数,它会覆盖掉无参的构造函数
作者: 皮卫凯    时间: 2012-9-20 18:26
黑马张涛 发表于 2012-9-20 18:23
类中都有默认的无参构造函数,如果你定义了一个构造函数,它会覆盖掉无参的构造函数 ...

这个我知道,但我自定义一个有参构造函数,为什么会出错呢?
作者: 黑马张涛    时间: 2012-9-20 18:37
你是不是用了有参的构造函数覆盖掉了无参的构造函数之后,还用这一句: per=(Person)demo.newInstance();  创建person的实例?
newInstance默认调用无参的构造函数创建对象,那里现在没有无参的构造函数,它调用谁呢?
这时你可以在自己定义一个无参的构造函数就可以了!
或者你通过反射先拿到有参的构造函数,再通过这个构造函数创建对象!
作者: 皮卫凯    时间: 2012-9-20 19:12
黑马张涛 发表于 2012-9-20 18:37
你是不是用了有参的构造函数覆盖掉了无参的构造函数之后,还用这一句: per=(Person)demo.newInstance();   ...

赞一个,我懂了。 :victory:
作者: 赵永康    时间: 2012-9-20 19:33
你定义了带有参数的构造方法,用反射创建对象的时候,就不能用Class的方法newInstance()去创建对象了,因为他是默认的去创建无参的构造方法
这时候你就应该Person.class.getConstrucor(具体参数自己传).newInstance(具体参数自己传);是先得到相应的构造方法的类在相应用它的newInstance()这个方法去创建实例对象

作者: 影子木木    时间: 2012-9-20 19:54
newInstance();  是通过无参构造来实例话的, 如果你类里面没有定义任何构造方法的话, jvm会自动去找无参构造,如果这个时候你在类里面定一个有参构造的话,jvm就会去找那个有参构造,为了避免这个错误再把无参构造加上。
作者: 黄敏    时间: 2012-9-21 08:52
本帖最后由 黄敏 于 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;
    }
  





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