講解一下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
- 使用指定的 二進制名稱來加載類。此方法使用與
方法相同的方式搜尋類。Java 虛拟機調用它來分析類引用。調用此方法等效于調用loadClass(String, boolean)
。loadClass(name, false)
-
- 參數:
-
- 類的 二進制名稱name
傳回: - 得到的 Class 對象
-
protected Class<?> findClass(String name)
throws ClassNotFoundException
- 使用指定的 二進制名稱查找類。此方法應該被類加載器的實作重寫,該實作按照委托模型來加載類。在通過父類加載器檢查所請求的類後,此方法将被
方法調用。預設實作抛出一個 ClassNotFoundException。loadClass
-
- 參數:
-
- 類的 二進制名稱name
傳回: - 得到的 Class 對象
-
java中的類加載器主要是父親委托機制,其中的父親委托機制并不是繼承,而是聚集。下一篇文檔會解析一下ClassLoader的源碼
在父親委托機制中,各個加載器按照父子關系形成了樹的結構,除了跟類加載器以為,其餘的類加載器有且隻有一個父加載器。
下圖是一個類加載器的樹形圖結構,表示父親委托機制之間的關系:
以下是一個根據上圖的一個類加載過程的執行個體講解:
以下圖檔介紹定義類加載器和初始類加載器:
類加載之間的真正的關系:
為什麼要使用父親委托機制???
命名空間:
運作時包: