天天看點

java類加載器的父親委托機制詳細介紹

講解一下ClassLoader這個類

java.lang.Object
  
        
java類加載器的父親委托機制詳細介紹
java.lang.ClassLoader

類加載器是負責加載類的對象。 ClassLoader 類是一個抽象類。如果給定類的 二進制名稱,那麼類加載器會試圖查找或生成構成類定義的資料。一般政策是将名稱轉換為某個檔案名,然後從檔案系統讀取該名稱的“類檔案”。

ClassLoader 類使用委托模型來搜尋類和資源。每個 ClassLoader 執行個體都有一個相關的父類加載器。需要查找類或資源時,ClassLoader 執行個體會在試圖親自查找類或資源之前,将搜尋類或資源的任務委托給其父類加載器。虛拟機的内置類加載器(稱為 "bootstrap class loader")本身沒有父類加載器,但是可以将它用作 ClassLoader 執行個體的父類加載器。

ClassLoader 有二個構造方法:

//這個構造方法 傳回 

getSystemClassLoader() 傳回的類加載器,就是系統類加載器。

protected ClassLoader()      
使用方法

getSystemClassLoader()

傳回的 ClassLoader 建立一個新的類加載器,将該加載器作為父類加載器。

如果存在安全管理器,則調用其

checkCreateClassLoader

方法。這可能導緻安全性異常。
//這個帶參數的構造方法,可以指定目前類的父加載器
protected ClassLoader(ClassLoader parent)      

使用指定的、用于委托操作的父類加載器建立新的類加載器。

如果存在安全管理器,則調用其

checkCreateClassLoader

方法。這可能導緻安全性異常。
參數:

parent

- 父類加載器
public Class<?> loadClass(String name)
                   throws ClassNotFoundException      
使用指定的 二進制名稱來加載類。此方法使用與

loadClass(String, boolean)

方法相同的方式搜尋類。Java 虛拟機調用它來分析類引用。調用此方法等效于調用

loadClass(name, false)

參數:

name

- 類的 二進制名稱
傳回:
得到的 Class 對象 
protected Class<?> findClass(String name)
                      throws ClassNotFoundException      
使用指定的 二進制名稱查找類。此方法應該被類加載器的實作重寫,該實作按照委托模型來加載類。在通過父類加載器檢查所請求的類後,此方法将被

loadClass

方法調用。預設實作抛出一個 ClassNotFoundException。
參數:

name

- 類的 二進制名稱
傳回:
得到的 Class 對象

java中的類加載器主要是父親委托機制,其中的父親委托機制并不是繼承,而是聚集。下一篇文檔會解析一下ClassLoader的源碼

在父親委托機制中,各個加載器按照父子關系形成了樹的結構,除了跟類加載器以為,其餘的類加載器有且隻有一個父加載器。

下圖是一個類加載器的樹形圖結構,表示父親委托機制之間的關系:

java類加載器的父親委托機制詳細介紹

以下是一個根據上圖的一個類加載過程的執行個體講解:

java類加載器的父親委托機制詳細介紹

以下圖檔介紹定義類加載器和初始類加載器:

java類加載器的父親委托機制詳細介紹
java類加載器的父親委托機制詳細介紹

類加載之間的真正的關系:

java類加載器的父親委托機制詳細介紹
java類加載器的父親委托機制詳細介紹

為什麼要使用父親委托機制???

java類加載器的父親委托機制詳細介紹

命名空間:

java類加載器的父親委托機制詳細介紹

運作時包:

java類加載器的父親委托機制詳細介紹