天天看點

Class.forName用法

反射機制必定用到Class.forName 這個方法。上周有個同僚在分享這塊的時候延展的談到了Class.forName的一些用法。

1、Class.forName(String className);

2、Class.forName(String name,boolean initialize,ClassLoader loader);

通常大家都會認為,某個類中的static初始化區塊都是在類加載 的時候就被調用到唯一的一次。真的是這樣麼?帶着這個問題,我們來看看Class.forName這個方法。

Java代碼 

public class Word {

static{

System.out.println(“Word Init….”);

}

public class Test {

public static void main(String[] args) {

try{

Class cls = Class.forName(“Word”,false,ClassLoader.getSystemClassLoader());

}catch(Exception e){

e.printStackTrace();

public class Test1 {

Class cls = Class.forName(“Word”,true,ClassLoader.getSystemClassLoader());

類Test和Test1運作的結果不一樣:

Test:

Test1:Word Init…

為什麼會這樣?

Class.forName中的第二個參數在發生着作用。

不管用new還是class.forName來産生執行個體都隐含着兩個部分:類加載+靜态初始化區塊調用;

靜态初始化區塊是在newInstance()的時候才被真正調用,是以Class.forName的第二個參數“false”的時候,定義不需要調用靜态初始化區塊,這就是為什麼産生如上結果的原因了。

給一些應聘來工程師問這個問題,大家的回答多為靜态初始化區塊在類加載的時候被調用的。真正的是:靜态初始區塊并不是類加載的時候就調用,而是在第一次執行個體化的時候真正被調用 。

本文轉自 神相 51CTO部落格,原文連結:http://blog.51cto.com/shenxiang/269185,如需轉載請自行聯系原作者