JAVA利用反射机制并实例化一个类的几种方法。
第一种:Class.forName("类的路径名").newInstance();
Class.forName("类的全路径").newInstance()
原理就是反射机制,通过名字找到类的映射Class,然后Class中提供了一个通过调用类的init()构造方法进行初始化类。如果类找不到会抛出ClassNotFoundException异常。
第二种:Object.class.newInstance();
第二种方式其实也是通过对象本身提供了一个可以理解为对象快照的副本,这个跟JVM类加载机制的原理有关。
第三种:Object.getClass().newInstance();
第三种方式是通过对象本身在自己的超类Object对象中提供了一个获取Class对象的方法.
共同点:这三种方法都是JAVA反射机制的实现,都需要得到Class对象,然后通过它去new出一个实例出来。需要注意的是当执行对象的实例方法时:如果该对象没有提供可访问到的构造方法,则会抛出实例化异常InstantiationException。
Class的特性:Class其实就是JAVA类编译之后产生的字节码文件,它提供了私有的构造函数,这个Class里面仅仅只有一个带有传递ClassLoader参数的构造函数,外部无法构造出Class的实例,它是由JVM(JAVA虚拟机)来创建的下面截图所述。
用途:
通过Class可以获取反射加载过来的对象的属性,超类,所在类路径,类加载器等方法。
可参考Class类里的实例化方法。
总结
同一个对象的不同实例对应的是同一个Class类。
抽象类,接口,数组,没有无参构造函数的对象都不能通过Class.newInstance()进行实例化。
private 修饰的构造函数是可以实例化的,因为有下面的操作。
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Voidrun() {
c.setAccessible(true);
return null;
}
});
网友评论