1. 程式人生 > 實用技巧 >java類載入器的父親委託機制詳細介紹

java類載入器的父親委託機制詳細介紹

>>> hot3.png

講解一下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