版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
圣思園科 主講人張AllJava虛擬機(jī)與程序的生命周 加載:查找并加載類(lèi)的二進(jìn)制數(shù)連解析:把類(lèi)中的符號(hào)轉(zhuǎn)換為直接,類(lèi)的加載、連掛與初始化,加加 Java程序?qū)︻?lèi)的使用方式可分為兩主動(dòng)使使 主動(dòng)使用(六種) 式都被看作是對(duì)類(lèi)的使用,都不會(huì)導(dǎo)加載.class文件的方從zip,jar等歸檔文件中加載.class'..· l1
i 構(gòu)l
!t!tIIl1 I lI !!ClassClass對(duì)象封裝了類(lèi)在方法區(qū)內(nèi)的數(shù)據(jù)結(jié),并且向Java程序員提供了方法區(qū)內(nèi)有兩種類(lèi)型的類(lèi)加載Java虛擬機(jī)自帶的加根類(lèi)加載器java.lang.ClassLoader類(lèi)的驗(yàn)證的內(nèi)類(lèi)的驗(yàn)證的驗(yàn)證主要包括以下內(nèi)容類(lèi)文件的結(jié)構(gòu)檢查:確保類(lèi)文件遵從Java類(lèi)文件的固定m士”語(yǔ)義檢查:確保類(lèi)本身符合Java語(yǔ)言的語(yǔ) 定,比如驗(yàn)證final類(lèi)型的類(lèi)沒(méi)子類(lèi),以及”“f.U.大土中兒『凸以1--:::1一區(qū)1~lill.O字節(jié)碼驗(yàn):確保字節(jié)碼流可以被Java虛擬機(jī)安全地執(zhí)行。字節(jié)碼流代衣』a方法(包括靜態(tài)方法和實(shí)例方法),它是由被稱(chēng) 作碼的單字節(jié)指令組成后都跟若一個(gè)或多個(gè)操作數(shù)。字節(jié)碼驗(yàn)證步驟會(huì)檢查每個(gè)操作碼是否合法,即是否有諸合法的操作數(shù)。二進(jìn)制兼容的驗(yàn)證:確保相 的類(lèi)之間協(xié)調(diào)一致。例如在Worker類(lèi)的toWork()方法中會(huì)調(diào)用Car類(lèi)的run()方法。Java虛擬機(jī)在驗(yàn)證Worker類(lèi)時(shí)會(huì)檢查在方法區(qū)內(nèi)是否存在Car類(lèi)的runO方法,假如不存在(當(dāng)Worker類(lèi)和r類(lèi)的版本不兼容,就會(huì)出現(xiàn)這種問(wèn)題),就會(huì)拋出NoSu ethodError錯(cuò)誤類(lèi)的準(zhǔn)各準(zhǔn)備階段,Jav虛擬機(jī)為類(lèi)的靜態(tài)變品分配內(nèi)存,并設(shè)笠默認(rèn)的初始值。例如對(duì)千以下Sample類(lèi),在準(zhǔn)備階段,將為int類(lèi)型的靜態(tài)變?cè)詀分配4個(gè)字節(jié)的內(nèi)存空間,并且賦予默認(rèn)值O,為long類(lèi)型的靜態(tài)變址b分配8個(gè)字節(jié)的內(nèi)存空間,并且汃認(rèn)值0 ccp出li
=..C2}類(lèi)的解析在解析階段,Java虛擬機(jī)會(huì)把類(lèi)的一進(jìn)制數(shù)據(jù)中的符號(hào) 替換為直接 。例如在Worker類(lèi)的gotoWork()方法中會(huì) Car類(lèi)的run()方沁心licvoidgocam()】}Worker類(lèi)的二進(jìn)制數(shù)據(jù)中,包含了一個(gè)對(duì)Car類(lèi)的runO方法的符 的全名和相關(guān)描述符組成。在解析階段,Java虛擬機(jī)會(huì)把這個(gè)符號(hào) 替換為一個(gè)指針,該指針指向Car類(lèi)的run()方法在方法區(qū)內(nèi)的內(nèi)存位翌,這個(gè)指針就是直接 類(lèi)的初始化叨始化階段,Java虛擬機(jī)執(zhí)行類(lèi)的初始化心代碼塊中進(jìn)行初始化。例如在以下代碼而靜態(tài)變員c沒(méi)有被顯式初始化,它將保持默認(rèn)值0
的處進(jìn)行初始化;(2)a和b都被顯式初始化p叩lieclasublic·stati
e{ longb;loatic壇2;
II )}類(lèi)的初始化心、變亂 語(yǔ)句,以及靜態(tài)代碼塊都被看做類(lèi)的初始化語(yǔ)句按照初始化語(yǔ)旬在類(lèi)文件中的先后順序來(lái)依次執(zhí)行它們。例如當(dāng)以下Sample類(lèi)被初化后,它的靜態(tài)變攬a的取值為4taticinca=l:Sta已c{a=2;}static{ a:::4;} voidmainStr江gargs1匈st如.outprintin正飛a);I打印類(lèi)的初始化步主動(dòng)使用(六種)式都被看作是使用,不會(huì)導(dǎo)致類(lèi)的初類(lèi)的初始化時(shí)機(jī)(3)當(dāng)Java虛擬機(jī)初始化一個(gè)類(lèi)時(shí),要求它的所有父類(lèi)都已經(jīng)被初始化,但是在初始化一個(gè)類(lèi)時(shí),并不會(huì)先初始化它所實(shí)現(xiàn)的接口。在初始化一個(gè)接口時(shí),并不會(huì)先初始化它的父接已。因此,一個(gè)父接口并不會(huì)因?yàn)樗淖咏涌诨蛘邔?shí)現(xiàn)類(lèi)的初始化而初始化。,白次使用特定接口的靜態(tài)變量時(shí),才會(huì)導(dǎo)致該接口的初始化。,類(lèi)加載器把類(lèi)加載到Java虛擬機(jī)中。從JDK 1.2版本開(kāi)始,類(lèi)的加載過(guò)中叩托機(jī)制,這種機(jī)制能更好地保證Java平臺(tái)的安全。在此委托機(jī)制中,除了Java帶的根類(lèi)加載器以外,其余的類(lèi)加載器都有且只有一個(gè)父加載器。當(dāng)Java請(qǐng)求加載器loader]加載Sample類(lèi)時(shí),loaderI首先委托自己的父加載器去加載則由父加載器完成加載任務(wù),否則才由加載器loaderl本身加 Java虛擬機(jī)自帶了以下幾種加載器積(Bootstrap)類(lèi)加載器:該加載器沒(méi)有父加載器。它負(fù)責(zé)加載虛擬機(jī)的就是由根類(lèi)加載器加載的。根類(lèi)加載器從系統(tǒng)屈性sun.boot.class.path所指定的加載類(lèi)庫(kù)。根類(lèi)加載器的實(shí)現(xiàn)依賴(lài)千底層操作系統(tǒng),屈千虛擬機(jī)的實(shí)現(xiàn)的一部分,它并沒(méi)有繼承java.lang.CI邸sLoader大擴(kuò)展(Extension)類(lèi)加載器:它的父加載器為根類(lèi)加載器。它從爾統(tǒng)屬性所指定 中加載類(lèi)庫(kù),或者從JDK的安 的 F加載類(lèi)庫(kù),如果把用戶(hù)創(chuàng)建的JAR文件放在這個(gè)也會(huì)自動(dòng)巾擴(kuò)展類(lèi)加載器加載。擴(kuò)展類(lèi)加載器是純Java大,走java.lang.ClassLoader類(lèi)的子類(lèi)系統(tǒng)(System)類(lèi)加載器:也稱(chēng)為應(yīng)用類(lèi)加載器,它的父加載器為擴(kuò)展類(lèi)加它從環(huán)境交址classpath或者系統(tǒng)屬性java.classpath所指定的中加載類(lèi),它是用戶(hù)自定義的類(lèi)加載器的默認(rèn)父加載器。系統(tǒng)類(lèi)加載器是純Java類(lèi),是java.lang.ClassLoader類(lèi)的子類(lèi)。以力以力力力力力,J、J盧[、盧[類(lèi)加載的父委托機(jī)制托機(jī)制中,各個(gè)加載器按照父子關(guān)系形成了樹(shù)形結(jié)構(gòu),除了根類(lèi)加載器余的類(lèi)加載器都有且只有一個(gè)父加載器,類(lèi)加載的父委托機(jī)制lo吐r2 lo吐r2、pgIpgI類(lèi)加載的父委托機(jī)制Class哱叩1eClas年loader2loadClassloader2首先 名空間中查找Sample類(lèi)是否已經(jīng)被加載,如果已經(jīng)加載就直接返回代表Sample類(lèi)的Class對(duì)象 amp比欠還沒(méi)有被加載,loader2首先請(qǐng)求loaderI代為加載,統(tǒng)類(lèi)加載器代為加載,系統(tǒng)類(lèi)加載器再請(qǐng)求擴(kuò)展類(lèi)加載器代為加載,擴(kuò)展類(lèi)加再請(qǐng)求根類(lèi)加載器代為加載。若根類(lèi)加載器和擴(kuò)展類(lèi)加載器都不能加載,則系統(tǒng)試加載,若能加載成功,則將Sample類(lèi)所對(duì)應(yīng)的Class對(duì)象的 loader1再 返回給loader2,從而成功將S皿ple類(lèi)加載進(jìn)虛擬心統(tǒng)類(lèi)加載器不能加載S印1ple類(lèi),則loaderl嘗試加載Sample類(lèi),若loader]也不能成功加載,則loader2嘗試加載。若所有的父加載器及l(fā)oade立本身都不能加載,則拋出assNotFoundException異常類(lèi)加載的父委托機(jī)制·E”··E”,口,類(lèi)加載的父委托機(jī)制口,二rl二rl類(lèi)加載的父委托機(jī)制,類(lèi)加載的父委托機(jī)制托機(jī)制的優(yōu)點(diǎn)是能夠提高軟件系統(tǒng)的安全性。因?yàn)樵诖藱C(jī)制下,用戶(hù)自定義的類(lèi)加載器不可能加載應(yīng)該由父加載器加載的可靠類(lèi),從而防止不可靠甚至的代碼代替由父加載器加載的可靠代碼。例如,java.lang.Ob_ject類(lèi)總是由根類(lèi)加載器加他任何用戶(hù)自定義的類(lèi)加載器都不可能加載含有代碼的命名空間 個(gè)類(lèi);在不同名空間中,有可能會(huì)出現(xiàn)類(lèi)的完整名字(包括類(lèi)的包名)相同的 -運(yùn)行時(shí)包同一個(gè)運(yùn)行時(shí)包,不僅要看它們的包名是否相同,還要看定義類(lèi)加載司一運(yùn)行時(shí)包的類(lèi)才能互 包可見(jiàn)(即默 級(jí)別)的樣的限制能避免用戶(hù)自定義的類(lèi)冒充 類(lèi)庫(kù)的類(lèi),去 類(lèi)庫(kù)的包可見(jiàn)成貝。假設(shè)用戶(hù)自己定義了一個(gè)類(lèi)java.lang.Spy,并由用戶(hù)自定義的類(lèi)加載器加 類(lèi)庫(kù)java.lang.*由不同的加載器加載,它們屈千不同的運(yùn)行時(shí)包,所以java.lang.Spy不能 類(lèi)庫(kù)java.lang包中的包可見(jiàn)成貝。創(chuàng)建用戶(hù)自定義的類(lèi)加載器創(chuàng)建用戶(hù)自己的類(lèi)加載器,只需要擴(kuò)展java.lang.ClassLoader類(lèi),然后覆蓋它的findClass(Stringname)方法即可,該方法根據(jù)參數(shù)指定的類(lèi)的名字,返回對(duì)應(yīng)的Cla對(duì)象的。創(chuàng)霪用戶(hù)自定義的類(lèi)加載器K吐 C出5'1 1創(chuàng)壅用戶(hù)自定義的類(lèi)加載器“'執(zhí)行l(wèi)oader2.JoadClass(11Sample”)時(shí),先由它上層的所有父加載器嘗試加mple奀。loaderl從D:\myapp\serverlib 下成功地加載fSample類(lèi),因此loader是Sample類(lèi)的定義類(lèi)加載器,1oaderl和loader2挫Sample類(lèi)的初始類(lèi)加載如執(zhí)行l(wèi)oader3.loadClassC'Sample”)時(shí),先由它上層的所有父加載ample類(lèi)。loader3的父加載器為根類(lèi)加載器,它無(wú)法加載Sample類(lèi),接D:\myapp\otherlib 下成功地加載了Sample類(lèi),因此loaderj走amp
、...A從創(chuàng)霪用戶(hù)自定義的類(lèi)加載器,-,?P-----------,-,?P
--,lIli
bIbII'II·L1.I.Ii'II'的Cll l創(chuàng)建用戶(hù)自定義的類(lèi)加載器(2)在Samole類(lèi)中主動(dòng)使用了Dog類(lèi),當(dāng)執(zhí)行Sample類(lèi)的構(gòu)造方法中的newJava虛擬機(jī)而要先加載Dog類(lèi),到底用哪個(gè)類(lèi)加載器加載呢?從步驟(l)的打印結(jié)果可以石出,加載Sample類(lèi)的loaderI還加載了Dog類(lèi),Java虛擬機(jī)會(huì)用SamDl的定義類(lèi)加載器上加載Dog類(lèi),加載過(guò)程也同樣采用父親委托機(jī)制。為了驗(yàn)證這二.D:\myapp\serverlib目錄下的Dog.class文件刪除,然后在D:\m存放一個(gè)Dog.class文件,此時(shí)程序的打印結(jié)果為,Samplefloaded切Dog loadedbyloader3
ld609-創(chuàng)建用戶(hù)自定義的類(lèi)加載器由此可見(jiàn),當(dāng)由loaderl加載的Sample類(lèi)首次主動(dòng)使用Dog類(lèi)時(shí),Dog類(lèi)由系_加載器加載。如果把D:\myapp\serverlib和D:\myapp\syslib 下的Dog.clas"'都刪除,然后在D:\myapp\ 下存放一個(gè)Dog.class文件,,此時(shí)的 結(jié)構(gòu)參見(jiàn)圖10-8。當(dāng)由loader!加載的Samp1e類(lèi)首次主動(dòng)使用Dog類(lèi)時(shí),由千loader I及匕的父加載器都無(wú)法加載Dog類(lèi),因此test{loader2)方 拋出ClassNotFoundException。創(chuàng)霪用戶(hù)自定義的類(lèi)加載器II ,不同類(lèi)加載 同一個(gè)命名空間內(nèi)的類(lèi)是相互可見(jiàn)的加載 名空l(shuí)同包含所有父加載 名空間。因此由子加載器加載E看見(jiàn)父加載器加載的類(lèi)。例如系統(tǒng)類(lèi)加載器加載的類(lèi)能看見(jiàn)根加載的大由父加載器加載的類(lèi)不能看見(jiàn)子加載器加載的大如果兩個(gè)加載器之間沒(méi)有直接或間接的父子關(guān)系,那么它們各自加載的類(lèi)相修改MyClassLoader類(lèi)的源代不同類(lèi)加載 yClassLoader類(lèi)由系統(tǒng)類(lèi)加載器加載,而Sample類(lèi)由loaderl類(lèi)加載,因此ader類(lèi)的main()方法中使用lassDefFoundE訂or錯(cuò)誤個(gè)不同命名空間內(nèi)的類(lèi)相互不可見(jiàn)時(shí),可采用Java反射機(jī)制 對(duì)方實(shí)的屬性和方法。如果把MyClassLoader類(lèi)的main()方法替換為如下代碼:不同類(lèi)加載 如果把件拷貝到
的Sample.class和Dog.class刪除,再把這芯,然后運(yùn)行例程10-8中的main()方法,也能正常運(yùn)行此時(shí)MyClassLoader類(lèi)和Sample六間內(nèi),因此
系統(tǒng)類(lèi)加載器加載,由千它們位于同一個(gè)命類(lèi)的卸載當(dāng)Sample類(lèi)被加載、連接和初始化后,它的生命周期就開(kāi)始了。當(dāng)代表的Class對(duì)象不再 ,即不可觸及時(shí),Class對(duì)象就會(huì)結(jié)束生命周期方法區(qū)內(nèi)的數(shù)據(jù)也會(huì)被卸載,從而結(jié)束Sample類(lèi)的生命周期。由此可見(jiàn),一個(gè)類(lèi)何時(shí)結(jié)束生命周期,取決于代表它的Class對(duì)象何時(shí)結(jié)束生命周期,類(lèi)的卸載由Java虛擬機(jī)自帶的類(lèi)加載器所加載的類(lèi),在虛擬機(jī)的生命周期中,始終不入卸載。前面已經(jīng)介紹過(guò),Java虛擬機(jī)自帶的類(lèi)加載器包括根類(lèi)加載器、擴(kuò)展類(lèi)加載器和系統(tǒng)類(lèi)加載器。Java虛擬機(jī)本身會(huì)始終 這些類(lèi)加載器,而這些類(lèi)加載器則會(huì)始 它們所加載的類(lèi)的Class對(duì)象,因此這些Class對(duì)象始終是可觸及的。,類(lèi)的卸載把Sampleclass和Dogclass拷貝到D:\myappClassLoader類(lèi)的main()方法替換為如下代碼.publics,ta,ticvoidmain;(砒 a為6) thi:OI泗Ex七
錄 歡lassLoader loaderl··=n的歡lass邁忒erPloaderi”)l.setP忒h(“D:\\邱,ap_p\\serverlib\\"'',,;ClassobjClss=16adrl.loadClass(飛迪lJ)le"};SyB七巳n.out.print1n尸objClasS'!;JhashCode 飛objClass.hashCode(l);
IIII@II
e(}
/III?II?lloaderln氐邸lasLoaderJ"'loaderl勹,objClass=stem.out,p豆類(lèi)的卸載運(yùn)行以上
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)電設(shè)備維修工安全生產(chǎn)規(guī)范模擬考核試卷含答案
- 水泥制成工班組協(xié)作水平考核試卷含答案
- 中藥炮炙工崗前實(shí)操掌握考核試卷含答案
- 杜美絲制造工崗前履職考核試卷含答案
- 2025年鑄鐵及相關(guān)金屬制衛(wèi)生、廚房器具、餐具合作協(xié)議書(shū)
- 2025年雕刻雕銑設(shè)備控制系統(tǒng)合作協(xié)議書(shū)
- 2025廣東深圳市人才流動(dòng)中心有限公司招聘筆試筆試歷年參考題庫(kù)附帶答案
- 2026年智能保溫取餐柜項(xiàng)目項(xiàng)目建議書(shū)
- 2025年江蘇省無(wú)錫市中考語(yǔ)文真題卷含答案解析
- 牛年介紹教學(xué)
- 消化內(nèi)鏡ERCP技術(shù)改良
- 云南師大附中2026屆高三1月高考適應(yīng)性月考卷英語(yǔ)(六)含答案
- 2026湖北隨州農(nóng)商銀行科技研發(fā)中心第二批人員招聘9人筆試備考試題及答案解析
- 騎行美食活動(dòng)方案策劃(3篇)
- 2026年上海市松江區(qū)初三語(yǔ)文一模試卷(暫無(wú)答案)
- 石化企業(yè)環(huán)保培訓(xùn)課件
- 2026年呂梁職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試備考試題帶答案解析
- 清華大學(xué)教師教學(xué)檔案袋制度
- 2025年新疆師范大學(xué)輔導(dǎo)員招聘考試真題及答案
- 人教版九年級(jí)物理上學(xué)期期末復(fù)習(xí)(知識(shí)速記+考點(diǎn)突破+考點(diǎn)練習(xí)題)含答案
- 電梯更新改造方案
評(píng)論
0/150
提交評(píng)論