(一)首先要明白在java中任何class都要装载在虚拟机上才能运行
1、Class.forName()就是装载类用的(new是根据加载到内存中的类创建一个实例),如果给你一个包名和类名,可以通过Class.forName(“package.A”).newInstance()来实例化它,其效果和new
A()是一样的。
2、JVM在装载类的时候会执行类的静态代码段,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码,而以后就不会再执行这段静态代码了。Class.forName()的作用就是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码块。
3、可以使用Class.forName()来实现动态加载和创建Class对象,比如想要根据用户输入的字符串来创建对象。
(二)在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要的区别是?
1、它们的区别在于创建对象的方式不一样,newInstance()是使用类加载机制,后者是创建一个新类。
2、存在这两种创建方式,主要考虑到软件的可伸缩性、可扩展性和可重用性等软件涉及思想,java中工厂模式经常使用newInstance()方法来创建对象,可以实现从配置文件中读取配置字符串,根据字符串来生成相对于的类并且实例化。
3、从JVM的角度看,使用new创建类的时候,这个类可能没有被加载,但使用newInstance()方法的时候,就必须保证这个类已经加载了,就是由Class.forName()来完成的,这个静态方法调用了启动加载器。
(三)new和newInstance()的区别
1、newInstance():弱类型、低效率,只能调用无参构造。
2、new:强类型、相对高效,能调用任何public构造