Class.forName和classloader的區(qū)別

JVM類加載

如圖所示,這是java JVM 類裝載過程,Java是如何加載到j(luò)vm里面然后被識(shí)別的呢,其實(shí)分為三步:

裝載:(loading)找到class對(duì)應(yīng)的字節(jié)碼文件。

連接:(linking)將對(duì)應(yīng)的字節(jié)碼文件讀入到JVM中。

初始化:(initializing)對(duì)class做相應(yīng)的初始化動(dòng)作。

Java中兩種加載class到JVM中的方式

Class.forName("className");其實(shí)這種方法調(diào)運(yùn)的是:

Class.forName(className, true,ClassLoader.getCallerClassLoader())方法??? ???

?參數(shù)一:className,需要加載的類的名稱。??? ????

參數(shù)二:true,是否對(duì)class進(jìn)行初始化(需要initialize)??? ????

參數(shù)三:classLoader,對(duì)應(yīng)的類加載器

?ClassLoader.laodClass("className"); 其實(shí)這種方法調(diào)運(yùn)的是ClassLoader.loadClass(name, false)方法:? ? ? ?

?參數(shù)一:name,需要加載的類的名稱??? ???

?參數(shù)二:false,這個(gè)類加載以后是否需要去連接(不需要linking)

兩種方式的區(qū)別:

Class.forName除了將類的.class文件加載到j(luò)vm中之外,還會(huì)對(duì)類進(jìn)行解釋,執(zhí)行類中的static塊。

而classloader只干一件事情,就是將.class文件加載到j(luò)vm中,不會(huì)執(zhí)行static中的內(nèi)容,只有在newInstance才會(huì)去執(zhí)行static塊。?forName("")得到的class是已經(jīng)初始化完成的

?loadClass("")得到的class是還沒有連接的??一般情況下,這兩個(gè)方法效果一樣,都能裝載Class。但如果程序依賴于Class是否被初始化,就必須用Class.forName(name)了。最重要的區(qū)別是 forName 會(huì)初始化Class,而 loadClass 不會(huì)。因此如果要求加載時(shí)類的靜態(tài)變量被初始化或靜態(tài)塊里的代碼被執(zhí)行就只能用 forName,而用 loadClass 只有等創(chuàng)建類實(shí)例時(shí)才會(huì)進(jìn)行這些初始化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容