黑马程序员技术交流社区

标题: 反射的问题 [打印本页]

作者: 郑小杰    时间: 2012-8-11 10:43
标题: 反射的问题
  1. package Test;

  2. class Person{
  3. private String name;
  4. private int age;



  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. @Override
  18. public String toString(){
  19. return "["+this.name+" "+this.age+"]";
  20. }
  21. }

  22. class reflectTest{
  23. public static void main(String[] args) {
  24. Class<?> demo=null;
  25. try{
  26. demo=Person.class;
  27. }catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. Person per=null;
  31. try {
  32. per=(Person)demo.newInstance();
  33. } catch (InstantiationException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. } catch (IllegalAccessException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. per.setName("lisi");
  41. per.setAge(20);
  42. System.out.println(per);
  43. }
  44. }
复制代码
为什么 把Person中的默认的无参构造函数取消的时候,自己再定义一个有参数的构造函数之后,会出现错误:
比如定义了一个构造函数:
public Person(String name, int age) {                this.age=age;                this.name=name;        }
然后继续运行上面的程序,会出现:
java.lang.InstantiationException: Reflect.Person   
还有,是不是该先得到有参的那个构造函数,然后再用这个构造函数创建对象?

作者: 胡刚涛    时间: 2012-8-11 11:44
用反射得到的一个class类 在调用它的public T newInstance()方法,可以创建此 Class 对象所表示的类的一个新实例,
但是用该方法得到的如同用一个带有一个空参数列表的 new 表达式实例化该类。
如果该类没有定义构造函数系统会定义一个无参数的构造函数 Person() {  };
当定义了一个构造函数:
public Person(String name, int age) {                this.age=age;                this.name=name;        }时
该类就不会再有无参数的构造函数了
所以该方法会报告错误。
代码改动一下希望你能理解
class Person{

private String name;

private int age;
public Person() {
System.out.println("被调用");      
}

public Person(String name, int age) {
this.age=age;         
this.name=name;      
}



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;

}

@Override
public String toString(){

return "["+this.name+" "+this.age+"]";
}

}


class reflectTest{

public static void main(String[] args) {
Class<?> demo=null;

try{

demo=Person.class;

}catch (Exception e) {

e.printStackTrace();

}

Person per=null;

try {

per=(Person)demo.newInstance();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

per.setName("lisi");

per.setAge(20);

System.out.println(per);

}

}
运行结果
被调用
[lisi 20]



作者: 王程    时间: 2012-8-11 14:09
本帖最后由 王程 于 2012-8-11 14:10 编辑

查看API知道的,
public T newInstance()
              throws InstantiationException,
                     IllegalAccessException
创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。
如果没有无参的构造方法,就会抛出InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 nullary 构造方法; 或者由于某种其他原因导致实例化过程失败。
catch (InstantiationException e)
{
System.out.println("就是这个异常");//在这里插入这一句可以证明是不是这个异常
printStackTrace();

}
作者: 郑小杰    时间: 2012-8-12 09:46
问题已解决




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