大家都用過Class.forName(),也都知道是類加載的作用,其實這方法不只是類加載,還有類初始化。
下面用個小例子說明一下:
A類,是用來加載的類
/** * 用來測試類加載的類此類有 * 靜態代碼塊,靜態參數 * 代碼塊,參數 * 構造器 */ public class A { static int i = 1; static{ System.out.println("靜態代碼塊初始化"); } int x = 0; { System.out.println("代碼塊初始化"); } public A() { System.out.println("構造方法初始化"); } }
TestClass類,用來測試的加載類的測試類:
/** * 此方法用來測試Class.forName()的功能 */ public class TestClass { /** * Class.forName()方法會做兩件事 * 1.會把指定的類加載到內存 * 2.然后把指定的類初始化(類初始化只初始化靜態參數和代碼塊,因為靜態是和類同生的) * @throws ClassNotFoundException */ @Test public void test() throws ClassNotFoundException{ Class clazz = Class.forName("A"); } /** * Class.forName(String clazz,boolean bl,ClassLoader cl) * 第一個參數就是要加載類的類路徑 * 第二個參數可以指定類加載時是否初始化類 * 第三個參數可以指定加載類的類加載器 * @throws ClassNotFoundException */ @Test public void test2() throws ClassNotFoundException{ ClassLoader cl = Class.forName("TestClass").getClassLoader(); Class.forName("A", false, cl); } }
結果:
1.test()輸出結果是
靜態代碼塊初始化
說明,Class.forName()不僅加載了類,還初始化了類參數(靜態)。
2.test2()輸出結果是
(空)
說明,Class.forName(String,boolean,ClassLoader)可以指定加載類的類路徑、是否初始化類參數、加載類的類加載器。當第二個參數為false時,只加載類,不初始化類。
其實,分析一下Class.forName()的源碼會發現,forName(String)方法和forName(String,true,currentClassloader)的作用是一樣的!