Java類加載器

摘自: 王法波 [email protected] <<How tomcat works>>翻譯,第八章 類加載器


在每次創建一個Java類的實例時候,必須先將該類加載到內存中。Java虛擬機(JVM)使用類加載器來加載類。Java加載器在Java核心類庫和CLASSPATH環境下面的所有類中查找類。如果需要的類找不到,會拋出java.lang.ClassNotFoundException異常。

J2SE1.2開始,JVM使用了三種類加載器:bootstrap類加載器、extension類加載器和systen類加載器。這三個加載器是父子關係,其中bootstrap類加載器在頂端,而system加載器在結構的最底層。

其中bootstrap類加載器用於引導JVM,一旦調用java.exe程序,bootstrap類加載器就開始工作。因此,它必須使用本地代碼實現,然後加載JVM需要的類到函數中。另外,它還負責加載所有的Java核心類,例如java.langjava.io包。另外bootstrap類加載器還會查找核心類庫如rt.jari18n.jar等,這些類庫根據JVM和操作系統來查找。

extension類加載器負責加載標準擴展目錄下面的類。這樣就可以使得編寫程序變得簡單,只需把JAR文件拷貝到擴展目錄下面即可,類加載器會自動的在下面查找。不同的供應商提供的擴展類庫是不同的,Sun公司的JVM的標準擴展目錄是/jdk/jre/lib/ext

system加載器是默認的加載器,它在環境變量CLASSPATH目錄下面查找相應的類。

這樣JVM使用哪個類加載器?答案在於委派模型(delegation model),這是出於安全原因。每次一類需要加載,system馬上加載類。相反,它委派該任務給它的父類-extension類加載器。extension類加載器也把任務委派給它的父類bootstrap類加載器。因此,bootstrap類加載器總是首先加載類。如果bootstrap類加載器不能找到所需要的類的extension類加載器會嘗試加載類。如果擴展類加載器也失敗,system類加載器將執行任務。如果系統類加載器找不到類,一個java.lang.ClassNotFoundException異常。爲什麼需要這樣的往返模式委派模型對於安全性是非常重要的。如你所知,可以使用安全管理器來限制訪問某個目錄。現在,惡意的意圖有人能寫出一類叫做java.lang.Object,可用於訪問任何在硬盤上的目錄。因爲JVM的信任java.lang.Object類,它不會關注這方面的活動。因此,如果自定義java.lang.Object被允許加載的安全管理器將很容易癱瘓。幸運的是,這將不會發生,因爲委派模型會阻止這種情況的發生。下面是它的工作原理。

當自定義java.lang.Object在程序中被調用的時候system類加載器將該請求委派給extension類加載器,然後委派給bootstrap類加載器。這樣bootstrap類加載器搜索的核心庫,找到標準java.lang.Object實例化它。這樣,自定義java.lang.Object永遠不會被加載

關於在Java類加載機制的優勢在於可以通過擴展java.lang.ClassLoader抽象類來擴展自己的類加載器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章