1. 程式人生 > >java類載入器和雙親委派載入機制

java類載入器和雙親委派載入機制

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

系統類載入器,又稱為應用程式類載入器,是載入CLASSPATH環境變數下所指定的jar包與類路徑,一般來說,使用者自定義的就是由APP ClassLoader載入的

各類載入器之間的關係

   以組合關係複用父類載入器的父子關係,注意,這裡的父子關係並不是以繼承關係實現的

類載入器的雙親委派載入機制(重點)

  當一個類收到了類載入請求,他首先不會嘗試自己去載入這個類,而是把這個請求委派給父類去完成,每一個層次類載入都是如此,因此所有的載入請求都應該傳送到啟動類載入器中,只有當父類載入器反饋自己無法完成這個請求的時候(在它的載入路徑裡找不到這個所需要載入的類),子類載入器才會嘗試自己去載入

過程如下圖所示:


雙親委派模型的原始碼實現

   主要體現在ClassLoader的loadClass()方法,思路很簡單:先檢查是否已經被載入,若沒有被載入則呼叫父類的LoadClass()方法,若父類載入器為空,則預設使用啟動類載入器作為父類載入器,如果父類載入器載入失敗,丟擲ClassNotFoundException異常後,呼叫自己的findClass()方法進行載入