在Class类当中实例化对象是一个最常用的的操作,以后所有的框架的基本原理都是根据这个实现。
正常情况下,我们使用new关键字实例化一个对象,现在我们通过Class类完成,步骤如下:
·根据packeg.class实例化对象
·通过Class类中的 newInstance()
package obc19;
public class Main {
public static void main(String[] args) {
Class<?> c = null;
try {
c=Class.forName("OopDemo19.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Person p = (Person) c.newInstance();
System.out.println(p.getAge());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
现在对象实例成功了,以上代码在以后的开发中,特别在使用框架研究框架原理的时候,经常会问到,但是我们这样写事实上忽略一个问题。就是,这种情况该对象所属的类其实要求必须要有无参构造方法。
实例化的时候调用指定的构造方法:
如果一个类当中真的没有无参构造方法,那么我们只能选择调用指定的构造方法来实例化。
package obc19;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main {
public static void main(String[] args) throws Exception{
Class<?> c = null;
Person p = null;
c = Class.forName("OopDemo19.Person");
Constructor<?> cus[] = c.getConstructors();
p = (Person)cus[0].newInstance(40);
System.out.println(p.getAge());
}
}
这种形式相对于前面第一种调用无参构造方法明显来的复杂而且也不是很实用,以后开发中要求习惯性地给每一个实体的类或者有构造方法的类一个无参构造方法。