首先来看看Class.forName到底是执行的什么方法
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className, true, ClassLoader.getCallerClassLoader());
}
classloader JDK里面执行的方法
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
可以很明显看到在JDK里面的方法中,两种方法的第二个参数不一样。
Class的装载分了三个阶段,loading,linking ,initializing
Class.forName 第二个参数是true ,在loadClass后必须初始化。
classloader 第二个参数是false,目标对象被装载后不进行链接,也就不会下一步initializing了。不过可以调用newInstance()方法,就初始化了。
初始化了和没有初始化的很明显不一样的就是static块代码执行与否。
可能这样说大家也记不清楚,还不如写两个类,看下实际跑的情况
package org.test;
public class Value {
private static String str = "aaa";
private static String str1 = "bbb";
private String str2 = "ccc";
static{
System.out.println(str);
System.out.println(str1);
}
private static void getValue1(){
System.out.println(str);
System.out.println(str1);
}
private void getValue2(){
System.out.println(str);
System.out.println(str1);
System.out.println(str2);
}
public static void main(String[] args) {
System.out.println("main方法");
}
}
package org.test;
public class Test {
public static void main(String[] args) throws Exception {
String url = "org.test.Value";
// Class.forName(url);
// Thread.currentThread().getContextClassLoader().loadClass(url);
Thread.currentThread().getContextClassLoader().loadClass(url).newInstance();
}
}
大家把这两个类在eclipse中debug看 ,可以看到main方法中的三种加载类的区别。