天天看點

Class.forName()的作用

Class.forName()所做的工作

大家都用過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)的作用是一樣的!