java類裝載體系中的隔離_第1頁(yè)
已閱讀1頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、JavaJava類裝載體系中的隔離性類裝載體系中的隔離性Java中類的查找與裝載出現(xiàn)的問(wèn)題總是會(huì)時(shí)不時(shí)出現(xiàn)在Java程序員面前,這并不是什么丟臉的事情,相信沒(méi)有一個(gè)Java程序員沒(méi)遇到過(guò)ClassNotException因此不要為被人瞅見(jiàn)自己也犯這樣的錯(cuò)誤而覺(jué)得不自然,但是在如果出現(xiàn)了ClassNotFoundException后異常后一臉的茫然,那我想你該了解一下java的類裝載的體制了,同時(shí)為了進(jìn)行下面的關(guān)于類裝載器之間的隔離性的討

2、論,我們先簡(jiǎn)單介紹一下類裝載的體系結(jié)構(gòu)。1.Java類裝載體系結(jié)構(gòu)裝載類的過(guò)程非常簡(jiǎn)單:查找類所在位置,并將找到的Java類的字節(jié)碼裝入內(nèi)存,生成對(duì)應(yīng)的Class對(duì)象。Java的類裝載器專門用來(lái)實(shí)現(xiàn)這樣的過(guò)程,JVM并不止有一個(gè)類裝載器,事實(shí)上,如果你愿意的話,你可以讓JVM擁有無(wú)數(shù)個(gè)類裝載器,當(dāng)然這除了測(cè)試JVM外,我想不出還有其他的用途。你應(yīng)該已經(jīng)發(fā)現(xiàn)到了這樣一個(gè)問(wèn)題,類裝載器自身也是一個(gè)類,它也需要被裝載到內(nèi)存中來(lái),那么這些類裝載

3、器由誰(shuí)來(lái)裝載呢,總得有個(gè)根吧?沒(méi)錯(cuò),確實(shí)存在這樣的根,它就是神龍見(jiàn)首不見(jiàn)尾的BootstrapClassLoader.為什么說(shuō)它神龍見(jiàn)首不見(jiàn)尾呢,因?yàn)槟愀緹o(wú)法在Java代碼中抓住哪怕是它的一點(diǎn)點(diǎn)的尾巴,盡管你能時(shí)時(shí)刻刻體會(huì)到它的存在,因?yàn)閖ava的運(yùn)行環(huán)境所需要的所有類庫(kù),都由它來(lái)裝載,而它本身是C寫的程序,可以獨(dú)立運(yùn)行可以說(shuō)是JVM的運(yùn)行起點(diǎn)偉大吧。在Bootstrap完成它的任務(wù)后,會(huì)生成一個(gè)AppClassLoader(實(shí)際上之

4、前系統(tǒng)還會(huì)使用擴(kuò)展類裝載器ExtClassLoader,它用于裝載Java運(yùn)行環(huán)境擴(kuò)展包中的類)這個(gè)類裝載器才是我們經(jīng)常使用的,可以調(diào)用ClassLoader.getSystemClassLoader()來(lái)獲得,我們假定程序中沒(méi)有使用類裝載器相關(guān)操作設(shè)定或者自定義新的類裝載器,那么我們編寫的所有java類通通會(huì)由它來(lái)裝載,值得尊敬吧。AppClassLoader查找類的區(qū)域就是耳熟能詳?shù)腃lasspath,也是初學(xué)者必須跨過(guò)的門檻,有沒(méi)

5、有靈光一閃的感覺(jué),我們按照它的類查找范圍給它取名為類路徑類裝載器。還是先前假定的情況,當(dāng)Java中出現(xiàn)新的類,AppClassLoader首先在類傳遞給它的父類類裝載器,也就是ExtionClassLoader,詢問(wèn)它是否能夠裝載該類,如果能,那AppClassLoader就不干這活了,同樣ExtionClassLoader在裝載時(shí),也會(huì)先問(wèn)問(wèn)它的父類裝載器。我們可以看出類裝載器實(shí)際上是一個(gè)樹狀的結(jié)構(gòu)圖,每個(gè)類裝載器有自己的父親,類裝載

6、器在裝載類時(shí),總是先讓自己的父類裝載器裝載(多么尊敬長(zhǎng)輩)如果父類裝載器無(wú)法裝載該類時(shí),自己就會(huì)動(dòng)手裝載,如果它也裝載不了,那么對(duì)不起,它會(huì)大喊一聲:Exception,classnotfound。有必要提一句,當(dāng)由直接使用類路徑裝載器裝載類失敗拋出的是NoClassDefFoundException異常。如果使用自定義的類裝載器loadClass方法或者ClassLoader的findSystemClass方法裝載類,如果你不去刻意改

7、變,那么拋出的是ClassNotFoundException。我們簡(jiǎn)短總結(jié)一下上面的討論:去裝載C類,也就是說(shuō)JVM按照運(yùn)行時(shí)的有效執(zhí)行語(yǔ)句,來(lái)決定是否需要裝載新類,從而裝載盡可能少的類,這一點(diǎn)和編譯類是不相同的。2.2顯式的類裝載使用顯示的類裝載方法很多,我們都裝載類test.A為例。使用Class類的fName方法。它可以指定裝載器,也可以使用裝載當(dāng)前類的裝載器。例如:Class.fName(“test.A“)它的效果和Class.

8、fName(“test.A“truethis.getClass().getClassLoader())是一樣的。使用類路徑類裝載裝載.ClassLoader.getSystemClassLoader().loadClass(“test.A“)使用當(dāng)前進(jìn)程上下文的使用的類裝載器進(jìn)行裝載,這種裝載類的方法常常被有著復(fù)雜類裝載體系結(jié)構(gòu)的系統(tǒng)所使用。Thread.currentThread().getContextClassLoader().l

9、oadClass(“test.A“)使用自定義的類裝載器裝載類publicclassMyClassLoaderextendsURLClassLoaderpublicMyClassLoader()super(newURL[0])MyClassLoadermyClassLoader=newMyClassLoader()myClassLoader.loadClass(“test.A“)MyClassLoader繼承了URLClassLoade

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論