java類載入器和雙親委派載入機制
阿新 • • 發佈:2019-02-14
java類載入器分類詳解
1、Bootstrap ClassLoader:啟動類載入器,也叫根類載入器,負責載入java的核心類庫,例如(%JAVA_HOME%/lib)目錄下的rt.jar(包含System,String這樣的核心類),根類載入器非常特殊,它不是java.lang.ClassLoader的子類,它是JVM自身內部由C/C++實現的,並不是java實現的
2、Extension ClassLoader:擴充套件類載入器,負責載入擴充套件目錄(%JAVA_HOME%/jre/lib/ext)下的jar包,使用者可以把自己開發的類打包成jar包放在這個目錄下即可擴充套件核心類以外的功能
3、System ClassLoader\APP ClassLoader
各類載入器之間的關係
以組合關係複用父類載入器的父子關係,注意,這裡的父子關係並不是以繼承關係實現的
類載入器的雙親委派載入機制(重點)
當一個類收到了類載入請求,他首先不會嘗試自己去載入這個類,而是把這個請求委派給父類去完成,每一個層次類載入都是如此,因此所有的載入請求都應該傳送到啟動類載入器中,只有當父類載入器反饋自己無法完成這個請求的時候(在它的載入路徑裡找不到這個所需要載入的類),子類載入器才會嘗試自己去載入
過程如下圖所示:
雙親委派模型的原始碼實現
主要體現在ClassLoader的loadClass()方法,思路很簡單:先檢查是否已經被載入,若沒有被載入則呼叫父類的LoadClass()方法,若父類載入器為空,則預設使用啟動類載入器作為父類載入器,如果父類載入器載入失敗,丟擲ClassNotFoundException異常後,呼叫自己的findClass()方法進行載入