java類載入器的父親委託機制詳細介紹
講解一下ClassLoader這個類
java.lang.Object 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的原始碼
在父親委託機制中,各個載入器按照父子關係形成了樹的結構,除了跟類載入器以為,其餘的類載入器有且只有一個父載入器。
下圖是一個類載入器的樹形圖結構,表示父親委託機制之間的關係:
以下是一個根據上圖的一個類載入過程的例項講解:
以下圖片介紹定義類載入器和初始類載入器:
類載入之間的真正的關係:
為什麼要使用父親委託機制???
名稱空間:
:
轉載於:https://my.oschina.net/mifans/blog/860606