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