資源描述:
《深入理解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,