package fanshe.ConstructorDemo;
import java.lang.reflect.Constructor;
class Person
{
private int age;
private String name;
Person()
{

}
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return this.age;
}
public String toString()
{
return "姓名:"+this.name+"\r\n"+"年龄:"+this.age;
}
}
public class InstanceDemo04
{
public static void main(String[] args)
{
Class<?> c=null;
try
{
c=Class.forName("fanshe.instanceDmeo.Person");
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
Person per=null;
Constructor<?>[] cons = null ;
cons=c.getConstructors();
try
{
per=(Person)cons[1].newInstance("java爱好者",20);
//per=(Person)cons[0].newInstance();
}
catch(Exception e2)
{
e2.printStackTrace();
}
//per.setAge(20);per.setName("java爱好者");
System.out.println(per);
}
}
为什么我调用不了第二个构造方法呢?

解决方案 »

  1.   

    是不是文件执行错了,看代码包是:fanshe.ConstructorDemo,那么是否是:
     c=Class.forName("fanshe.ConstructorDemo.Person");
    含main()方法的类是 InstanceDemo04,但报错的是 InstanceDemo03。
      

  2.   

    上面的44行代码应该是c=Class.forName("fanshe.ConstructorDemo.Person"),但是运行之后还会出错啊?这是为什么呢?
      

  3.   


    final Class startupClass =Class.forName("fanshe.ConstructorDemo.Person");
    final Constructor constructor =startupClass.getConstructor(new Class[] {String[].class , Integer.class});
    constructor.newInstance(new Object[] {"Java爱好者",20});
    可以试试这种取构造器的方法
      

  4.   

    楼主的Person类定义的构造方法都不是public的,所以代码:
    cons=c.getConstructors();
    应改为:
    cons=c.getDeclaredConstructors();改成这样的话,也有可能出错,返回的构造方法不一定是按定义顺序的。
    如果用con[1],报错的话,用con[0]试试。
    (之前有篇帖子,关于通过反射得到的构造方法在数组里的顺序,我查查,是什么结论来,一下子忘了)。
      

  5.   

    找到了,楼主参考一下这个帖子:
    http://bbs.csdn.net/topics/390183924