Class.forName和classLoader.loadClass加载类区别
public class PrivateCar {
private static int price = 123;
public PrivateCar() {
System.out.println("constructor invoke...");
}
static {
System.out.println("static block invoke..");
System.out.println("static field initial price: "+ price);
}
private String color;
protected void drive(){
System.out.println("drive private car the color is:"+ color);
}
}
测试用例:
@Test
public void classNewInstance()throws Exception{
System.out.println("===============Class.forName=======================");
Class clz = Class.forName("com.gml.pinlor.loader.PrivateCar");
// PrivateCar car = (PrivateCar) clz.newInstance();
System.out.println("===============classLoader.loadClass=======================");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class cla = classLoader.loadClass("com.gml.pinlor.loader.PrivateCar");
// PrivateCar privateCar = (PrivateCar) cla.newInstance();
}
结果:
===============Class.forName=======================
static block invoke..
static field initial price: 123
==============classLoader.loadClass================
可以看到Class.forName
形式加载类时会初始化静态属性和静态代码块,而classLoader.loadClass
方法就不会。
测试用例:
@Test
public void classNewInstance()throws Exception{
System.out.println("===============Class.forName=======================");
Class clz = Class.forName("com.gml.pinlor.loader.PrivateCar");
PrivateCar car = (PrivateCar) clz.newInstance();
System.out.println("\n==============classLoader.loadClass================");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class cla = classLoader.loadClass("com.gml.pinlor.loader.PrivateCar");
PrivateCar privateCar = (PrivateCar) cla.newInstance();
}
结果:
===============Class.forName=======================
static block invoke..
static field initial price: 123
constructor invoke...
==============classLoader.loadClass================
constructor invoke...
可以看到在调用newInstance()方法之后才会调用其构造函数