深入理解java加載類的機制

深入理解java加載類的機制

ID:18553104

大?。?2.50 KB

頁數(shù):13頁

時間:2018-09-18

深入理解java加載類的機制_第1頁
深入理解java加載類的機制_第2頁
深入理解java加載類的機制_第3頁
深入理解java加載類的機制_第4頁
深入理解java加載類的機制_第5頁
資源描述:

《深入理解java加載類的機制》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫

1、深入理解Java加載類的機制這里從三個方面講述javaclassloader1、翻譯一下classloader的相關(guān)技術(shù)文章(來自CoreJava第二卷的Chapter9.Security),由于我的英文水平有限,難免有不合適,請大家指出。2、將從web應(yīng)用出發(fā)模擬一下web應(yīng)用的classloader(這節(jié)是重點)3、通過測試2實現(xiàn)的classloader來加深理解  以下是翻譯的關(guān)于ClassLoader介紹  ?ClassLoader  JAVA編譯器把源代碼轉(zhuǎn)換成一個假想機器(就是我們所說的虛擬機)的語言。虛擬機指令被保存在class后綴的文件里。每一個類文件包含類和接口的定

2、義以及實現(xiàn)代碼。這些類文件必須被一個程序解釋,這個程序能夠把虛擬機的指令翻譯成宿主機的機器語言?! ∽⒁猓禾摂M機只加載執(zhí)行一個程序所需要的類文件。舉個例子,比如執(zhí)行MyProgram.class,虛擬機運行的步驟如下:1、虛擬機有一個加載類文件的機制,比如,從硬盤讀取文件或者就網(wǎng)絡(luò)獲得;虛擬機用這個機制加載MyProgram的類文件2、如果MyProgram有一個實例變量或者是超類,那么實例變量和超類的類文件也被加載。(加載一個類所依賴的所有類的過程叫做resolvingtheclass--》自己理解吧)3、然后虛擬機執(zhí)行MyProgram的main方法(因為是靜態(tài)方法,所以不需要n

3、ewMyProgram的實例)4、如果main方法或者main方法調(diào)用的方法需要其他的類的話,這些類也被加載。  類加載機制不是僅僅用一個類加載器,任何一個java程序至少有以下三個類加載器(為了不影響大家的理解,這里我就不翻譯這三個類加載器的名稱了)  Thebootstrapclassloader:加載系統(tǒng)類(有代表性的,jdk的rt.jar里的類),他是虛擬機的必要組成部分,并且一般是用C實現(xiàn)的?! ∫灿蓄惣虞d器對象(就是指具體的一個類加載器)不關(guān)聯(lián)bootstrapclassloader,比如String.class.getClassLoader()返回null.  Thee

4、xtensionclassloader:加載jre/lib/ext目錄下的class,你可以把你的jar文件放到這個目錄,extensionclassloader將會加載到j(luò)ar里面的類,即使你不設(shè)置classpath.(一些人建議使用這個機制以讓你不受classpath的煩擾,不過注意以下的警告)Thesystemclassloader(有時也叫應(yīng)用程序加載器):加載應(yīng)用程序類。  他主要加載classpath目錄和jar/zip文件里的class,通過設(shè)置CLASSPATH環(huán)境變量或者是運行java的時候用[-classpath]選項指定classpath在SUN的java實現(xiàn)里

5、,theextensionandsystemclassloaders都是用java實現(xiàn)的,他們都是URLClassLoader類的實例。  警告:如果你把jar文件放到j(luò)re/lib/ext目錄下,并且你的jar文件中的類需要加載一個不是systemorextension的類的話,你將遇到麻煩。擴展類加載器不使用類路徑。如果你想把類放到j(luò)re/lib/ext下進行管理的話,請牢記這一點。  ==》怎么理解這一點:也就是說如果你把自己的x.jar放到j(luò)re/lib/ext下的話,如果你自己的x.jar里的class要用到不在x.jar里也不在jre/lib/ext的類的話,會導(dǎo)致類加載

6、不了。不難想象吧,因為你x.jar里的類是由extensionclassloader加載的,他不會加載classpath路徑下的類。  警告:把jar文件放到j(luò)re/lib/ext目錄下,還有第二個缺陷:有時侯,程序員忘記了他很久以前放在這個目錄下的類文件?! ‘攃lassloader似乎忽略了類路徑(其實沒有,因為類加載總是先讓父的類加載器加載類,只有父的類加載器加載不了的話才由自己來加載,“extensionclassloader是systemclassloader的父,因此。..”),而加載了放在擴展目錄下的遺忘已久的類的時候,他們就會迷惑不解。  classloader有父子

7、關(guān)系,bootstrapclassloader以外的每一個classloader都有一個父的類加載器?! ☆惣虞d器會給父的加載器一個機會加載任何給定的類,如果父加載器加載失敗的話自身才去加載。  舉個例子,當系統(tǒng)classloader被要求加載一個系統(tǒng)類的時候(比如,java.util.ArrayList),那么,首先需要extensionclassloader加載,而extensionclassloader又先讓bootstrapclassloader,

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。