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