Java中怎么實(shí)現(xiàn)一個(gè)類加載器,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
站在用戶的角度思考問題,與客戶深入溝通,找到且末網(wǎng)站設(shè)計(jì)與且末網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋且末地區(qū)。
在虛擬機(jī)中其實(shí)類加載器有很多種,但主要分為下面的幾種,它們分別是:
啟動(dòng)類加載器
啟動(dòng)類加載器主要的功能是加載JAVA_HOME/lib目錄中的所有類庫。但它加載時(shí)有一個(gè)前提條件。就是虛擬機(jī)會(huì)按照指定的文件名來識(shí)別加載,例如rt.jar。如果名字不符合的類即使放到lib目錄中啟動(dòng)類加載器也不會(huì)加載。啟動(dòng)類加載器無法被Java程序直接引用,原因是啟動(dòng)類加載器是用C++語言實(shí)現(xiàn)的。
擴(kuò)展類加載器
擴(kuò)展類加載器的功能是加載JAVA_HOME/lib/ext目錄下的所有類庫。由于擴(kuò)展類加載器是用Java語言本身實(shí)現(xiàn)的,所以用戶可以直接使用擴(kuò)展類加載器。
應(yīng)用程序類加載器
應(yīng)用程序類加載器的功能是加載用戶類路徑(ClassPath)上所指定的類庫。用戶也可以直接使用應(yīng)用程序類加載器。通過下面的方式即可獲取一個(gè)應(yīng)用程序類加載器。
ClassLoader.getSystemClassLoader();
如果程序中沒有自定義類加載器,那么應(yīng)用程序類加載器就為該程序的默認(rèn)類加載器。
自定義類加載器
自定義類加載器顧名思義就是用戶自己開發(fā)的類加載器,Java API中提供了一些API可以幫助我們開發(fā)出自己的類加載器。
雙親委派模型
在上面我們提到了,在類加載器中雙親委派模型是非常重要的,那么到底什么是雙親委派模型呢?其實(shí)在上述這些類加載器中類加載器與類加載器之間都具有某種層次關(guān)系,這種關(guān)系就叫雙親委派模型。我們先看一下下面的圖,然后在做具體說明。
在類加載器中規(guī)定除了最頂層的啟動(dòng)類加載器外,其它的所有類加載器都必須有自己的父類加載器。如圖中顯示,自定義類加載器的父類加載器就是應(yīng)用程序類加載器,應(yīng)用程序類加載的器的父類加載器是擴(kuò)展類加載器,擴(kuò)展類加載器的父類加載器是啟動(dòng)類加載器。那這么做的目的是什么呢?為什么要有這種層次關(guān)系呢?
下面我們看一下雙親委派模型的工作流程。如果一個(gè)類加載器收到了一個(gè)類的加載請(qǐng)求,首先它不會(huì)去加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器,并且每一個(gè)類加載器都是如此,所以無論加載的哪一個(gè)類最終一定是會(huì)委派給啟動(dòng)類加載器加載的,因?yàn)樯鲜龅奈梢?guī)則。只有父類加載器無法加載時(shí)(該類加載器在它自己的范圍內(nèi)沒有搜索到該類)子類加載器才會(huì)嘗試自己去加載這個(gè)類。雖然我們知道了上述類加載器的工作流程,也就是雙親委派模型,那它到底對(duì)Java應(yīng)用程序到底有什么重要的性呢?下面我們舉一個(gè)簡(jiǎn)單的例子,來說明一下雙親委派模式的好處。
在有雙親委派模式下,啟動(dòng)類加載器可以搶在擴(kuò)展類加載器之前去加載類。擴(kuò)展類加載器可以在應(yīng)用程序類加載器之前加載類。應(yīng)用程序類加載器可以在自定義類加載器之前加載類。這樣在雙親-孩子委派鏈中,啟動(dòng)類加載器是最可信任的-核心Java API它會(huì)檢查每一個(gè)被加載的類,然后依次到擴(kuò)展類加載器、應(yīng)用程序類加載器、自定義類加載器。如果假如自定義類加載器試圖加載一個(gè)java.lang.Virus(病毒類)時(shí)會(huì)怎么樣呢?
按照雙親委派模型。這個(gè)類會(huì)一直委派到啟動(dòng)類加載器來加載這個(gè)類 ,因?yàn)閱?dòng)類加載器是核心的Java API 。在java.lang這個(gè)包中,沒有這個(gè)類,所以不能加載。按照雙親委派模型當(dāng)父類加載器不能加載時(shí),子類加載器嘗試加載。依次類推,其它的類加載器也不能加載這個(gè)類。于是由用戶自定義的類加載器來加載這個(gè)類。如果自定義類加載器成功加載了這個(gè)類。因?yàn)镴ava允許同一個(gè)包中有彼此訪問的權(quán)限,所以這個(gè)java.lang.Virus這個(gè)類就允許訪問java.lang包下所有類的權(quán)限,并且可以利用這個(gè)特殊的訪問權(quán)限來做一些不可告人的目的。這顯示是非常不安全的操作。那么類加載器怎么保證Java程序的運(yùn)行安全呢?
類加載器除了有上述的一些特性外,還有其它的特性來保證,防止這個(gè)代碼訪問java.lang包中的其它類的訪問權(quán)限。Java虛擬機(jī)是怎么實(shí)現(xiàn)的呢?
因?yàn)樵贘ava虛擬機(jī)中只把彼此訪問的特殊權(quán)限授予同一個(gè)類加載器加載到同一個(gè)包中的類型。因此 java.lang包的中的類是由啟動(dòng)類加載器加載的,而java.lang.Virus是由自定義類加載器加載的。所以這些類型不屬于同一個(gè)運(yùn)行時(shí)包。
運(yùn)行時(shí)包:它指由同一個(gè)類加載器加載的,屬于同一個(gè)包的,多個(gè)類型集合。
Java虛擬機(jī)在允許兩個(gè)類屬于同一個(gè)包進(jìn)行訪問之前,Java虛擬機(jī)不但要確定它們屬于同一個(gè)包,還必須確認(rèn)它們屬于同一個(gè)運(yùn)行時(shí)包(必須由同一個(gè)類加載器加載)。所以java.lang.Virus類不能訪問java.lang包下的權(quán)限。這樣就保證了Java程序的運(yùn)行安全。
關(guān)于Java中怎么實(shí)現(xiàn)一個(gè)類加載器問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
網(wǎng)頁標(biāo)題:Java中怎么實(shí)現(xiàn)一個(gè)類加載器
文章出自:http://sd-ha.com/article2/gpsdic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、營(yíng)銷型網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、云服務(wù)器、網(wǎng)站排名、定制網(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í)需注明來源: 創(chuàng)新互聯(lián)