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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑小杰 中级黑马   /  2012-8-11 10:43  /  1470 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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   
还有,是不是该先得到有参的那个构造函数,然后再用这个构造函数创建对象?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

3 个回复

倒序浏览
用反射得到的一个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]


评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王程 于 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();

}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

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