大家都用過Class.forName(),也都知道是類加載的作用,其實(shí)這方法不只是類加載,還有類初始化。
下面用個(gè)小例子說明一下:
A類,是用來加載的類
/** * 用來測(cè)試類加載的類此類有 * 靜態(tài)代碼塊,靜態(tài)參數(shù) * 代碼塊,參數(shù) * 構(gòu)造器*/public class A { static int i = 1; static{ System.out.); } int x = 0; { System.out.println("代碼塊初始化"); } public A() { System.out.println("構(gòu)造方法初始化"); }}
TestClass類,用來測(cè)試的加載類的測(cè)試類:
/** * 此方法用來測(cè)試Class.forName()的功能 */public class TestClass { /** * Class.forName()方法會(huì)做兩件事 * 1.會(huì)把指定的類加載到內(nèi)存 * 2.然后把指定的類初始化(類初始化只初始化靜態(tài)參數(shù)和代碼塊,因?yàn)殪o態(tài)是和類同生的) * @throws ClassNotFoundException */ @Test public void test() throws ClassNotFoundException{ Class clazz = Class.forName("A"); } /** * Class.forName(String clazz,boolean bl,ClassLoader cl) * 第一個(gè)參數(shù)就是要加載類的類路徑 * 第二個(gè)參數(shù)可以指定類加載時(shí)是否初始化類 * 第三個(gè)參數(shù)可以指定加載類的類加載器 * @throws ClassNotFoundException */ @Test public void test2() throws ClassNotFoundException{ ClassLoader cl = Class.forName("TestClass").getClassLoader(); Class.forName("A", false, cl); }}
結(jié)果:
1.test()輸出結(jié)果是
靜態(tài)代碼塊初始化
說明,Class.forName()不僅加載了類,還初始化了類參數(shù)(靜態(tài))。
2.test2()輸出結(jié)果是
說明,Class.forName(String,boolean,ClassLoader)可以指定加載類的類路徑、是否初始化類參數(shù)、加載類的類加載器。當(dāng)?shù)诙€(gè)參數(shù)為false時(shí),只加載類,不初始化類。
其實(shí),分析一下Class.forName()的源碼會(huì)發(fā)現(xiàn),forName(String)方法和forName(String,true,currentClassloader)的作用是一樣的!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注