首先来看看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(); } }