黑马程序员技术交流社区
标题: 反射的问题 [打印本页]
作者: 郑小杰 时间: 2012-8-11 10:43
标题: 反射的问题
- package Test;
- class Person{
- private String name;
- private int age;
- 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);
- }
- }
复制代码 为什么 把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 |