ClassLoader自我總結

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 ClassLoaderAppClassLoader.Bootstrap是用Java編寫的,我們在Java中看不到它(Bootstrap ClassLoader),null,JVM自帶的類裝載器,用來裝載核心類庫,如java.lang.*等。其中Extension ClassLoader負責加載擴展 的Java class(例如所有javax.*開頭的類和存放在JREext目錄下的類),ApplicationClassLoader負責加載應用程序自身的類。

AppClassLoaderParentExtClassLoader,而ExtClassLoaderParentBootstrap ClassLoader

Java中一共有四個類加載器,之所以叫類加載器,是程序要用到某個類的時候,要用類加載器載入內存。

這四個類加載器分別爲:Bootstrap ClassLoaderExtension ClassLoaderAppClassLoaderURLClassLoader。這4ClassLoader的優先級依次從高到低,使用所謂的“雙親委派模型”。確切地說,假如一個網絡類裝載器被請求裝載一個java.lang.Integer,它會首先把請求發送給上一級的類路徑裝載器,假如返回已裝載,則網絡類裝載器將不會裝載這個java.lang.Integer,假如上一級的類路徑裝載器返回未裝載,它纔會裝載java.lang.Integer.


注意:上面圖中Parent ClassLoader加載該Class不成功的話會繼續請求Parent ClassLoader,如果都加載不成功的話,纔會讓App ClassLoader加載該類

當運行一個程序的時候,JVM啓動,運行bootstrapclassloader,該ClassLoader加載java核心APIExtClassLoaderAppClassLoader也在此時被加載),然後調用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來加載完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章