跳至內容

Java類別載入器

出自Taiwan Tongues 台語維基
於 2025年8月22日 (五) 13:02 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Java 類別載入器(英語:Java Classloader)是 Java 執行的時陣環境(Java Runtime Environment)的一个部件,負責動態載入 Java 類別到 Java 虛擬機器的記憶體空間內底。類別通常是照顧載入,就是頭一擺使用這別時才載入。因為有矣類別載入器,Java 執行的時系統無需要知影檔案佮檔案系統。著學習類別載入器來講,掌握 Java 的委派概念是足重要的。

彼每一个 Java 類別著愛由某一个類別載入器裝入去記憶體。Java 程式會當通過類別載入器來利用外部庫(即由其他作者所編寫的軟體庫)。

JVM 中有三个預設的類別載入器:

一 . 引導(Bootstrap)類別載入器。由原生代碼(如 C 語言)編寫,無繼承自 ` java . lang . ClassLoader `。負責載入核心 Java 庫,儉佇咧 ` < JAVA _ HOME > / jre / lib ` kha-tá-lok-guh 中。 二 . 擴充(Extensions)類別載入器。用來佇咧 ` < JAVA _ HOME > / jre / lib / ext ` , 抑是 ` java . ext . dirs ` 中指明的 kha-tá-lok-guh 中載入 Java 的擴充庫。Java 虛擬機器的實現會提供一个擴充庫 kha-tá-lok-guh。該類別載入器在此 kha-tá-lok-guh 內底走揣並載入去 Java 類別。該類的由 ` sun . misc . Launcher $ ExtClassLoader ` 實現。 三 . Apps 類別載入器(嘛講系統類別載入器)。 根據 Java 應用程式的類別路徑(` java . class . path ` 抑是 CLASSPATH 環境變數)來載入 Java 類別。一般來講,Java 應用的類別攏是由伊來完成載入的。會當通過 ClassLoader . getSystemClassLoader ( ) 來取得伊。該類的由 ` sun . misc . Launcher $ AppClassLoader ` 實現。

逐个類別裝載器通過組合的方式包含一个父裝載器(parent class loader)。

JDK 一爿二了的引入去「雙親委派」方式來實現類別載入器的層次呼叫,趕緊保證 JDK 的系統 API 袂去予使用者定義的類別載入器所破壞,但是一寡使用場景會拍破這个慣例來實現必要的功能。

自訂類別載入器

開發會當通過繼承 ` java . lang . ClassLoader ` 類別的方式實現家己的類別載入器,以滿足一寡特殊的需求而無需要完全了解 Java 虛擬機器的類別載入的細節。

可用:

  • 執行的時裝載抑是解除安裝類別。這定用著:
  • 實現手稿語言
  • 用佇咧 bean 生成器
  • 允准使用者定義的擴充性
  • 允准號名的空間之間的通信。這是 CORBA / RMI 協定的基礎。
  • 改變 Java 位元組碼的裝入,比如講:可用 Java 類別位元組碼的加密裝入。
  • 修改已經裝入的位元組碼(weaving of aspects when using aspect-oriented programming)。

JEE 的類別裝載

Java EE(JEE)應用程式侍服器典型的所在用樹仔的一組類別裝載器對已經部署的 WAR 抑是 EAR 文件內底貯入類別。這一定愛應用程式之間彼此隔離,毋過已經部署模組。servlet container 一般被實現為濟類莫裝載器。

JAR 地獄

和 DLL 地獄仝款,一个組件的特定 JAR 存在版本差異,無仝版本的 JAR 檔案的 Class 檔案存在差異(包括講 Class 檔案的編譯版本、Class 的成員結構、Class 繼承關係等)的話,嘛會佇執行時觸發各種因為類別檔案結果衝突顛倒致使的錯誤警告。對於 Servlet 容器,猶閣存在容器所需要的 JAR 佮應用內所需要的 JAR 雙線衝突的問題。

無仝 DLL 地獄,Java 開發者會使用一寡專案管理程式(比如講 Apache Maven)來解決 JAR 版本之間的衝突,通過組態依賴關係檔案,設定無仝組件的 JAR 版本依賴關係,由專案管理程式自動載入相應合適的 JAR,來控制 JAR 間的這个版本關係。而對 Servlet 容器,嘛會通過家己實現類別載入器拍破 JDK 的「雙親委派」方式來避免 JAR 載入衝突。

參考文獻

外部連結

  • Chuck McManis , " The basics of Java class loaders " , 九百九十六
  • Brandon E . Taylor , " Java Class Loading : The Basics " , 兩千空三
  • Jeff Hanson , " Take Control of Class Loading in Java " , 二千空六鼻六鼻一
  • Andreas Schaefer , " Inside Class Loaders " , 二千空三孵十一孵十二
  • Sheng Liang and Gilad Bracha , " Dynamic class loading in the Java virtual machine " , In Proceedings of the 十三 th ACM Conference on Object-Oriented Programming , Systems , Languages , and Applications ( OOPSLA'九十八 ) , ACM SIGPLAN Notices , vol . 三十三 , no . 十 , ACM Press , 一千九百九十八 , pp .   三十六–四十四
  • Dr . Christoph G . Jung , " Classloaders Revisited Hotdeploy " , _ Java Specialist Newsletter _ , 二千空一鋪六板七
  • Don Schwarz , " Managing Component Dependencies Using ClassLoaders " , 二千空五五四配十三