ClassLoader 類加載問題 雙親委派

http://blog.itpub.net/31561269/viewspace-2222522/

在這裏插入圖片描述

JVM 中內置了三個重要的 ClassLoader
  • BootstrapClassLoader
  • ExtensionClassLoader
  • AppClassLoader
BootstrapClassLoader

負責加載 JVM 運行時核心類,這些類位於 JAVA_HOME/lib/rt.jar 文件中,我們常用內置庫 java.xxx.* 都在裏面,比如 java.util.、java.io.、java.nio.、java.lang. 等等。這個 ClassLoader 比較特殊,它是由 C 代碼實現的,我們將它稱之爲「根加載器」。

ExtensionClassLoader

負責加載 JVM 擴展類,比如 swing 系列、內置的 js 引擎、xml 解析器 等等,這些庫名通常以 javax 開頭,它們的 jar 包位於 JAVA_HOME/lib/ext/*.jar 中,有很多 jar 包。

AppClassLoader

是直接面向我們用戶的加載器,它會加載 Classpath 環境變量裏定義的路徑中的 jar 包和目錄。我們自己編寫的代碼以及使用的第三方 jar 包通常都是由它來加載的。

雙親委派

AppClassLoader 在加載一個未知的類名時,它並不是立即去搜尋 Classpath,它會首先將這個類名稱交給 ExtensionClassLoader 來加載,如果 ExtensionClassLoader 可以加載,那麼 AppClassLoader 就不用麻煩了。否則它就會搜索 Classpath 。

而 ExtensionClassLoader 在加載一個未知的類名時,它也並不是立即搜尋 ext 路徑,它會首先將類名稱交給 BootstrapClassLoader 來加載,如果 BootstrapClassLoader 可以加載,那麼 ExtensionClassLoader 也就不用麻煩了。否則它就會搜索 ext 路徑下的 jar 包。

這三個 ClassLoader 之間形成了級聯的父子關係,每個 ClassLoader 都很懶,儘量把工作交給父親做,父親幹不了了自己纔會幹。每個 ClassLoader 對象內部都會有一個 parent 屬性指向它的父加載器。

雙親委派規則可能會變成三親委派,四親委派,取決於你使用的父加載器是誰,它會一直遞歸委派到根加載器。

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