jdk下的解釋ClassLoader:
(1)類加載器是負責加載類的對象。ClassLoader 類是一個抽象類。如果給定類的二進制名稱,那麼類加載器會試圖查找或生成構成類定義的數據。一般策略是將名稱轉換爲某個文件名,然後從文件系統讀取該名稱的“類文件”。
(2)每個 Class 對象都包含一個對定義它的 ClassLoader 的引用。
(3)數組類的 Class 對象不是由類加載器創建的,而是由 Java 運行時根據需要自動創建。數組類的類加載器由 Class.getClassLoader() 返回,該加載器與其元素類型的類加載器是相同的;如果該元素類型是基本類型,則該數組類沒有類加載器。
谷歌搜到的資料總結:
java.lang.ClassLoader 類介紹
java.lang.ClassLoader 類的基本職責就是根據一個指定的類的名稱,找到或者生成其對應的字節代碼,然後從這些字節代碼中定義出一個 Java 類,即 java.lang.Class 類的一個實例。除此之外,ClassLoader 還負責加載 Java 應用所需的資源,如圖像文件和配置文件等。
JVM在運行時會產生三個ClassLoader:Bootstrap ClassLoader(C++)、Extension ClassLoader和AppClassLoader.Bootstrap是用Java編寫的,我們在Java中看不到它(Bootstrap ClassLoader),是null,是JVM自帶的類裝載器,用來裝載核心類庫,如java.lang.*等。其中Extension ClassLoader負責加載擴展 的Java class(例如所有javax.*開頭的類和存放在JRE的ext目錄下的類),ApplicationClassLoader負責加載應用程序自身的類。
AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent爲Bootstrap ClassLoader。
Java中一共有四個類加載器,之所以叫類加載器,是程序要用到某個類的時候,要用類加載器載入內存。
這四個類加載器分別爲:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和URLClassLoader。這4種ClassLoader的優先級依次從高到低,使用所謂的“雙親委派模型”。確切地說,假如一個網絡類裝載器被請求裝載一個java.lang.Integer,它會首先把請求發送給上一級的類路徑裝載器,假如返回已裝載,則網絡類裝載器將不會裝載這個java.lang.Integer,假如上一級的類路徑裝載器返回未裝載,它纔會裝載java.lang.Integer.
注意:上面圖中Parent ClassLoader加載該Class不成功的話會繼續請求Parent ClassLoader,如果都加載不成功的話,纔會讓App ClassLoader加載該類
當運行一個程序的時候,JVM啓動,運行bootstrapclassloader,該ClassLoader加載java核心API(ExtClassLoader和AppClassLoader也在此時被加載),然後調用ExtClassLoader加載擴展API,最後AppClassLoader加載CLASSPATH目錄下定義的Class,這就是一個程序最基本的加載流程。
關於自定義ClassLoader:
自定義ClassLoader需要繼承ClassLoader抽象類,重寫findClass方法,這個方法定義了ClassLoader查找class的方式。
主要可以擴展的方法有:
findClass 定義查找Class的方式
defineClass 將類文件字節碼加載爲jvm中的class
findResource 定義查找資源的方式
樣例:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
由於classloader 加載類用的是全盤負責委託機制。所謂全盤負責,即是當一個classloader加載一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負責載入,除非是顯式的使用另外一個classloader載入。
所以,當我們自定義的classloader加載成功了com.MyClass以後,MyClass裏所有依賴的class都由這個classLoader來加載完成。