Java 類加載器的理解(轉)


 java虛擬機中可以安裝多個類加載,系統默認三個主要類加載器,每個類負責加載特定位置的類:

BootStrap(內嵌在java虛擬機中由C++編寫)

ExtClassLoader

AppClassLoad


    類加載器也是java類,因爲其他是java類的類加載器本身也要被類加載器加載,顯然必須有第一個類加載器不是java類,這正是BootStrap.
    java虛擬機中的所有類裝載器採用具有父子關係的樹形結構進行組織,在實例化每個類裝載器對象時,需要爲其指定一個父級類裝載器對象
    或者採用系統類裝載器爲其父級類加載。
  類加載器之間的父子關係和管轄範圍:
    BootStrp------>JRE/lib/rt.jar
    ExtClassLoader---------->JRE/lib/ext/*.jar
    AppClassLoader---------->CLASSPATH指定的所有jar或目錄。 
  類加載器的委託機制:
   1.當所有祖宗類加載器沒有加載到類,回到發起者類加載器,還加載不了,則拋出ClassNotFoundException,不是再去找發起者類
        類加載器的兒子,因爲沒有getChild方法,即使有,那有多個兒子,找哪一個呢?
      2.對着類加載器的層次結構圖和委託加載原理,解釋先去將ClassLoaderTest輸出成jre/lib/ext目錄下的elva.jar包中後,運行結果爲
      ExtClassLoader的原因。
類加載器與 Web 容器
對 於運行在 Java EE? 容器中的 Web 應用來說,類加載器的實現方式與一般的 Java 應用有所不同。不同的 Web 容器的實現方式也會有所不同。以 Apache Tomcat 來說,每個 Web 應用都有一個對應的類加載器實例。該類加載器也使用代理模式,所不同的是它是首先嚐試去加載某個類,如果找不到再代理給父類加載器。這與一般類加載器的順 序是相反的。這是 Java Servlet 規範中的推薦做法,其目的是使得 Web 應用自己的類的優先級高於 Web 容器提供的類。這種代理模式的一個例外是:Java 核心庫的類是不在查找範圍之內的。這也是爲了保證 Java 核心庫的類型安全。
絕大多數情況下,Web 應用的開發人員不需要考慮與類加載器相關的細節。下面給出幾條簡單的原則:
1.每個 Web 應用自己的 Java 類文件和使用的庫的 jar 包,分別放在 WEB-INF/classes 和 WEB-INF/lib 目錄下面。
2.多個應用共享的 Java 類文件和 jar 包,分別放在 Web 容器指定的由所有 Web 應用共享的目錄下面。
3.當出現找不到類的錯誤時,檢查當前類的類加載器和當前線程的上下文類加載器是否正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章