這篇文章主要介紹classloader類加載器基于java類的加載方式的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括鐵山網(wǎng)站建設(shè)、鐵山網(wǎng)站制作、鐵山網(wǎng)頁(yè)制作以及鐵山網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鐵山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鐵山省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
基礎(chǔ)概念
Classloader 類加載器,用來(lái)加載 Java 類到 Java 虛擬機(jī)中。與普通程序不同的是。Java程序(class文件)并不是本地的可執(zhí)行程序。當(dāng)運(yùn)行Java程序時(shí),首先運(yùn)行JVM(Java虛擬機(jī)),然后再把Java class加載到JVM里頭運(yùn)行,負(fù)責(zé)加載Java class的這部分就叫做Class Loader。
JVM本身包含了一個(gè)ClassLoader稱為Bootstrap ClassLoader,和JVM一樣,BootstrapClassLoader是用本地代碼實(shí)現(xiàn)的,它負(fù)責(zé)加載核心JavaClass(即所有java.*開(kāi)頭的類)。另外JVM還會(huì)提供兩個(gè)ClassLoader,它們都是用Java語(yǔ)言編寫(xiě)的,由BootstrapClassLoader加載;其中Extension ClassLoader負(fù)責(zé)加載擴(kuò)展的Javaclass(例如所有javax.*開(kāi)頭的類和存放在JRE的ext目錄下的類),ApplicationClassLoader負(fù)責(zé)加載應(yīng)用程序自身的類。
當(dāng)運(yùn)行一個(gè)程序的時(shí)候,JVM啟動(dòng),運(yùn)行bootstrapclassloader,該ClassLoader加載java核心API(ExtClassLoader和AppClassLoader也在此時(shí)被加載),然后調(diào)用ExtClassLoader加載擴(kuò)展API,最后AppClassLoader加載CLASSPATH目錄下定義的Class,這就是一個(gè)程序最基本的加載流程。
注: 學(xué)ClassLoader看OSGI程序應(yīng)用
什么時(shí)候JVM會(huì)使用ClassLoader加載一個(gè)類呢?當(dāng)你使用java去執(zhí)行一個(gè)類,JVM使用ApplicationClassLoader加載這個(gè)類;然后如果類A引用了類B,不管是直接引用還是用Class.forName()引用,JVM就會(huì)找到加載類A的ClassLoader,并用這個(gè)ClassLoader來(lái)加載類B。JVM按照運(yùn)行時(shí)的有效執(zhí)行語(yǔ)句,來(lái)決定是否需要裝載新類,從而裝載盡可能少的類,這一點(diǎn)和編譯類是不相同的。
Why use your own ClassLoader?
似乎JVM自身的ClassLoader已經(jīng)足夠了,為什么我們還需要?jiǎng)?chuàng)建自己的ClassLoader呢?
因?yàn)镴VM自帶的ClassLoader只是懂得從本地文件系統(tǒng)加載標(biāo)準(zhǔn)的java class文件,如果編寫(xiě)你自己的ClassLoader,你可以做到:
1)在執(zhí)行非置信代碼之前,自動(dòng)驗(yàn)證數(shù)字簽名
2)動(dòng)態(tài)地創(chuàng)建符合用戶特定需要的定制化構(gòu)建類
3)從特定的場(chǎng)所取得java class,例如數(shù)據(jù)庫(kù)中
4) 等等
事實(shí)上當(dāng)使用Applet的時(shí)候,就用到了特定的ClassLoader,因?yàn)檫@時(shí)需要從網(wǎng)絡(luò)上加載java class,并且要檢查相關(guān)的安全信息。
應(yīng)用服務(wù)器大都使用了ClassLoader技術(shù),即使你不需要?jiǎng)?chuàng)建自己的ClassLoader,了解其原理也有助于更好地部署自己的應(yīng)用。
重點(diǎn)注明:其實(shí)一個(gè)已經(jīng)加載的類是無(wú)法被更新的,如果你試圖用同一個(gè)ClassLoader再次加載同一個(gè)類,就會(huì)得到異常(java.lang.LinkageError: duplicate classdefinition),我們只能夠重新創(chuàng)建一個(gè)新的ClassLoader實(shí)例來(lái)再次加載新類。至于原來(lái)已經(jīng)加載的類,開(kāi)發(fā)人員不必去管它,因?yàn)樗赡苓€有實(shí)例正在被使用,只要相關(guān)的實(shí)例都被內(nèi)存回收了,那么JVM就會(huì)在適當(dāng)?shù)臅r(shí)候把不會(huì)再使用的類卸載。
絕大部分Java程序都會(huì)使用3種系統(tǒng)提供的類加載器
1.啟動(dòng)類加載器(Bootstrap ClassLoader),負(fù)責(zé)將存在<JAVA_HOME>\lib目錄中的,或被-Xbootclasspath參數(shù)所指定的路徑中的,并且是虛擬機(jī)識(shí)別的類庫(kù)加載到虛擬機(jī)里.注意是按照文件名識(shí)別,如rt.jar,名字不符合的類庫(kù)即使放在lib目錄中也不會(huì)被加載。
2.擴(kuò)展類加載器(ExtClassLoader),它負(fù)責(zé)<JAVA_HOME>\lib\ext目錄中的,或被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫(kù).
3.應(yīng)用程序類加載器(App-ClassLoader),通過(guò)cassLoader.getSystemClassLoader()獲取,它負(fù)責(zé)加載用戶類路徑(ClassPath)上所指定的類庫(kù),一般情況下這個(gè)是程序中默認(rèn)的類加載器.
雙親委托模式 是Java設(shè)計(jì)者推薦給開(kāi)發(fā)者的一種類加載實(shí)現(xiàn)方式.雙親委托模型的工作過(guò)程是:如果一個(gè)類加載器收到了類加載請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器去完成.每一層次的類加載器都是如此,因此所有的加載請(qǐng)求最終都會(huì)傳送到頂層的啟動(dòng)類加載器中,只有當(dāng)父類加載器沒(méi)有找到所需的類時(shí),子加載器才會(huì)嘗試自己去加載。雙親模式的好處是Java類隨著它的類加載器一起具備了一種帶優(yōu)先級(jí)的層次關(guān)系。例如類Object,存放在rt.jar中,無(wú)論哪個(gè)類加載器加載這個(gè)類,最終都是委派給處于模型最頂端的啟動(dòng)類加載,因此Object類在程序使用多種類加載器環(huán)境中依然能保證是同一個(gè)類。相反,如果沒(méi)有使用雙親模型,就可能出現(xiàn)用戶自己編寫(xiě)一個(gè)Object類,導(dǎo)致系統(tǒng)中出現(xiàn)多個(gè)不同的Object類,這樣Java類型體系中最基礎(chǔ)的行為也就無(wú)法保證。
以上是“classloader類加載器基于java類的加載方式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站題目:classloader類加載器基于java類的加載方式的示例分析
文章來(lái)源:http://vcdvsql.cn/article36/iiihpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、App設(shè)計(jì)、標(biāo)簽優(yōu)化、定制網(wǎng)站、服務(wù)器托管、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)