类的加载方式不同
在执行Class.forName("xxyy.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段。
在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。
使用关键字new创建一个类的时候,这个类可以没有被加载,一般也不需要该类在classpath中设定,但可能需要通过classlaoder来加载。
所调用的构造方法不尽相同
new关键字能调用任何构造方法。
newInstance()只能调用无参构造方法。
执行效率不同
new关键字是强类型的,效率相对较高。
newInstance()是弱类型的,效率相对较低。
其他
既然使用newInstance()构造对象的地方通过new关键字也可以创建对象.
forname()会导致类被初始化,newInstance()才会实例化,而new()操作等于初始化+实例化。
适用
使用newInstance()在通用性方面比较高,className我们可以用配置文件进行相关的配置。
String className = 从配置文件中读取className;
A a = (A) Class.forName(className).newInstance();
再配合依赖注入的方法,就提高了软件的可伸缩性、可扩展性。框架的开发中用的比较多!
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
String str = (String) Class.forName("java.lang.String").newInstance();
String str1 = new String();
if(str.getClass() == str1.getClass()){
System.out.println("YES");
}
}
output:YES