今天就跟大家聊聊有關(guān)Class.forName和classloader加載類有什么不同,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián),為您提供重慶網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)成都社區(qū)文化墻等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗。創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!
一、類加載機制
往細(xì)了看大致分為5個階段:
(1)加載:java類運行時候會生成一個class字節(jié)碼文件,加載的過程就是去我們的操作系統(tǒng)尋找這個class文件。
(2)鏈接:這個過程就是把class文件加載到j(luò)ava虛擬機。
(3)初始化:在虛擬機中根據(jù)class文件進(jìn)行初始化。
(4)使用:這個過程大家都明白。
(5)卸載:使用完了,java虛擬機進(jìn)行清理。
對于class.forName和classloader來說針對的就是第一個過程,也就是加載過程。不過這倆雖然有一定的相似性,但是區(qū)別還是挺大的。
二 分析 Class.forName()和ClassLoader.loadClass
我們使用代碼,先看看如何使用。注意包的范圍,避免加載不了。
第一步:定義User類
第二步:測試
我們在上面的test方法中,使用了兩個加載方法?,F(xiàn)在我們測試一下:
是不感覺有點區(qū)別。現(xiàn)在是先給出一個大體的使用,下面我們分析一下他們的區(qū)別。
二、區(qū)別
1、class.forName
class.forName()前者除了將類的.class文件加載到j(luò)vm中之外,還會對類進(jìn)行解釋,執(zhí)行類中的static塊。注意這里的靜態(tài)塊指的是在類初始化時的一些數(shù)據(jù)。但是classloader卻沒有,想要弄清楚這個原因,還是直接到源碼中看看。
在這個源碼中我們會發(fā)現(xiàn),其實底層真正實現(xiàn)的是forName0方法,那這幾個參數(shù)又是什么意思呢?
(1)className:表示我們要加載的類名
(2)true:指Class被加載后是不是必須被初始化。 不初始化就是不執(zhí)行static的代碼即靜態(tài)代碼,在這里默認(rèn)為true,也就是默認(rèn)實現(xiàn)類的初始化。
(3)ClassLoader.getClassLoader(caller):表示類加載器,到這你會發(fā)現(xiàn)forNanme其實也是使用的ClassLoader類加載器加載的。
(4)caller:指定類加載器。
Class.forName(className)方法,內(nèi)部實際調(diào)用的方法是 Class.forName(className,true,classloader); 第2個boolean參數(shù)表示類是否需要初始化, Class.forName(className)默認(rèn)是需要初始化。 一旦初始化,就會觸發(fā)目標(biāo)對象的 static塊代碼執(zhí)行,static參數(shù)也也會被再次初始化。
2、classloader
在上面的案例中我們發(fā)現(xiàn),classloader并沒有初始化靜態(tài)塊,原因最好還是到源碼中看。
首先我們先進(jìn)入到loadclass方法中的源碼。
public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); }
這一步看起來還看不明白,沒關(guān)系這里真正實現(xiàn)的是內(nèi)部的loadclass,我們再跟進(jìn)去看看。
這個才是真正實現(xiàn)的方法,在這里的步驟其實很簡單,大致流程是先判斷class是否已經(jīng)被加載,如果被加載了那就重新加載,如果沒有加載那就使用雙親委派原則加載。加載的時候并沒有指定是否要進(jìn)行初始化。
所以現(xiàn)在他們的區(qū)別基本上很少,總結(jié)一下:
(1)class.forName()除了將類的.class文件加載到j(luò)vm中之外,還會對類進(jìn)行解釋,執(zhí)行類中的static塊。當(dāng)然還可以指定是否執(zhí)行靜態(tài)塊。
(2)classLoader只干一件事情,就是將.class文件加載到j(luò)vm中,不會執(zhí)行static中的內(nèi)容,只有在newInstance才會去執(zhí)行static塊。
三 數(shù)據(jù)庫鏈接為什么使用Class.forName(className)
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
看完上述內(nèi)容,你們對Class.forName和classloader加載類有什么不同有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
文章名稱:Class.forName和classloader加載類有什么不同
標(biāo)題網(wǎng)址:http://sd-ha.com/article6/pepiog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、自適應(yīng)網(wǎng)站、手機網(wǎng)站建設(shè)、小程序開發(fā)、企業(yè)建站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)