Class.forName(className)方法,其實調(diào)用的方法是Class.forName(className,true,classloader);注意看第2個boolean參數(shù)蔽介,它表示的意思慢洋,在loadClass后必須初始化吹泡。比較下我們前面準備jvm加載類的知識盟庞,我們可以清晰的看到在執(zhí)行過此方法后阶剑,目標對象的 static塊代碼已經(jīng)被執(zhí)行跃巡,static參數(shù)也已經(jīng)被初始化。
再看ClassLoader.loadClass(className)方法个扰,其實他調(diào)用的方法是ClassLoader.loadClass(className,false);還是注意看第2個 boolean參數(shù)瓷炮,該參數(shù)表示目標對象被裝載后不進行鏈接葱色,這就意味這不會去執(zhí)行該類靜態(tài)塊中間的內(nèi)容递宅。因此2者的區(qū)別就顯而易見了。
最后還有必要在此提一下new方法和newInstance方法的區(qū)別
newInstance: 弱類型苍狰。低效率办龄。只能調(diào)用無參構(gòu)造。
new: 強類型淋昭。相對高效俐填。能調(diào)用任何public構(gòu)造。