首頁  >  文章  >  Java  >  基於Java類別的載入方式之classloader類別載入器詳解

基於Java類別的載入方式之classloader類別載入器詳解

黄舟
黄舟原創
2017-10-20 09:29:221454瀏覽

下面小編就為大家帶來一篇classloader類別載入器_基於java類別的載入方式詳解。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

基礎概念

#Classloader 類別載入器,用來載入 Java 類別到 Java 虛擬機器中。與普通程序不同的是。 Java程式(class檔案)並不是本地的執行程式。當執行Java程式時,先執行JVM(Java虛擬機),然後再把Java class載入到JVM裡頭運行,負責載入Java class的這部分就叫做Class Loader。

JVM本身包含了一個ClassLoader稱為Bootstrap ClassLoader,和JVM一樣,BootstrapClassLoader是用本地程式碼實現的,它負責載入核心JavaClass(即所有java.*開頭的類別)。另外JVM還會提供兩個ClassLoader,它們都是用Java語言寫的,由BootstrapClassLoader載入;其中Extension ClassLoader負責載入擴充的Javaclass(例如所有javax.*開頭的類別和存放在JRE的ext目錄下的類別) ,ApplicationClassLoader負責載入應用程式本身的類別。

當執行一個程式的時候,JVM啟動,執行bootstrapclassloader,該ClassLoader載入java核心API(ExtClassLoader和AppClassLoader也在此時被載入),然後呼叫ExtClassLoader載入擴充API,最後AppClassLoader載入CLASSPATH目錄下定義的Class,這就是一個程式最基本的載入流程。

註: 學ClassLoader看OSGI程式應用

什麼時候JVM會使用ClassLoader載入一個類別呢?當你使用java去執行一個類,JVM使用ApplicationClassLoader載入這個類別;然後如果類A引用了類別B,不管是直接引用還是用Class.forName()引用,JVM就會找到載入類別A的ClassLoader,並用這個ClassLoader來載入類別B。 JVM依照運行時的有效執行語句,來決定是否需要裝載新類,從而裝載盡可能少的類,這一點和編譯類是不相同的。

Why use your own ClassLoader?

#似乎JVM自身的ClassLoader已經夠了,為什麼我們還要創造自己的ClassLoader呢?

因為JVM自帶的ClassLoader只是懂得從本機檔案系統載入標準的java class文件,如果寫自己的ClassLoader,你可以做到:

1)在執行非置信程式碼之前,自動驗證數位簽章

2)動態地建立符合使用者特定需求的客製化建置類別

#3)從特定的場所取得java class,例如資料庫中

4) 等等

事實上當使用Applet的時候,就用到了特定的ClassLoader,因為這時需要從網路上載入java class,並且要檢查相關的安全資訊。

應用程式伺服器大都使用了ClassLoader技術,即使你不需要建立自己的ClassLoader,了解其原則也有助於更好地部署自己的應用。

重點註明:其實一個已經載入的類別是無法被更新的,如果你試著用同一個ClassLoader再次載入同一個類,就會得到異常(java.lang.LinkageError: duplicate classdefinition),我們只能夠重新建立一個新的ClassLoader實例來再次載入新類別。至於原來已經載入的類,開發人員不必去管它,因為它可能還有實例正在被使用,只要相關的實例都被內存回收了,那麼JVM就會在適當的時候把不會再使用的類卸載。

絕大部分Java程式都會使用3種系統提供的類別載入器

1.啟動類別載入器(Bootstrap ClassLoader),負責將存在\lib目錄中的,或被-Xbootclasspath參數所指定的路徑中的,並且是虛擬機識別的類庫加載到虛擬機裡.注意是按照文件名識別,如rt.jar,名字不符合的類別庫即使放在lib目錄中也不會被載入。

2.擴充類別載入器(ExtClassLoader),它負責\lib\ext目錄中的,或被java.ext.dirs系統變數所指定的路徑中的所有類別庫.

3.應用程式類別載入器(App-ClassLoader),透過cassLoader.getSystemClassLoader()取得,它負責載入使用者類別路徑(ClassPath)上所指定的類別庫,一般情況下這個是程式中默認的類別載入器.

雙親委託模式是Java設計者推薦給開發者的一種類別載入實作方式.雙親委託模型的工作過程是:如果一個類別載入器收到了類別載入請求,它首先不會自己去嘗試載入這個類,而是把這個請求委派給父類別載入器去完成.每一層次的類別載入器都是如此,因此所有的載入請求最終都會傳送到頂層的啟動類別載入器中,只有當父類別載入器沒有找到所需的類別時,子載入器才會嘗試自己去載入。雙親模式的好處是Java類別隨著它的類別載入器一起具備了一種具有優先權的層次關係。例如類Object,存放在rt.jar中,無論哪個類加載器加載這個類,最終都是委派給處於模型最頂端的啟動類加載,因此Object類在程序使用多種類加載器環境中依然能保證是同一個類別。相反,如果沒有使用雙親模型,就可能出現使用者自己編寫一個Object類,導致系統中出現多個不同的Object類,這樣Java類型體系中最基礎的行為也就無法保證。

以上是基於Java類別的載入方式之classloader類別載入器詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn