反射機制必定用到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,如需轉載請自行聯系原作者