java class loader 學習

JAVA中的一切都是以類的形式存在的(除少數底層的東西,那些我就不清楚是怎麼回事了)。我們運行的接口是一個類,運行中所涉及到的對象也都是類對象。下面,我們來研究下,我所理解的類的加載機制。

比如我們有一個Student類,也就是經過編譯後,是一個Student.class文件。當我們的程序運行的過程中,第一次實例化一個student對象的時候,系統首先要做的就是加載Student這個類。也就是把Student.class以字節瑪的形勢加載到內存中(並通過defineClass()這個方法轉變成Class對象,最終以Class對象的形式存儲在內存中)。這個加載的過程就是由類加載器來完成的。

一般的,在程序啓動之後,系統會主要會有三個類加載器:Bootstrap Loader、ExtClassLoader與AppClassLoader。

Bootstrap Loader是由C++撰寫的,它主要負責搜索JRE所在目錄的classes或lib目錄下的.jar文件(例如rt.jar)是否需要被加載(實際上是由系統參數sun.boot.class.path來指定);ExtClassLoader主要負責搜索JRE所在目錄的lib/ext 目錄下的classes或.jar中是否需要被加載(實際上是由系統參數java.ext.dirs指定);AppClassLoader則是搜索 Classpath中是否有指定的classes需要被載入(由系統參數java.class.path指定)。

簡單的說,Bootstrap Loader、ExtClassLoader這兩個類加載器,主要是加載系統類庫裏的類。我們自己編輯的類一般都是由AppClassLoader來加載。當我們遇到如下代碼的時候:

Student stu  = new Student();
//實例化一個Student類的對象stu

AppClassLoader首先會到classpath下去尋找Student.class文件。(找不到則會拋出ClassNotFoundException異常)找到之後便會把Student這個類以二進制的形式存儲到內存中。這個過程也就是對Student類加載的過程。然後用我們加載到內存中的Student類去實例化一個Student對象stu。

以上就是所謂的隱式的類的加載過程。但是有些時候需要我們自定義一個類的加載器,這個時候就需要我們模仿這個過程,顯示的加載我們自己所需要的類。比如,我們自定義一個類的加載器MyClassLoader,那我們利用我們自定義的這個加載器,顯示的去加載一個類的過程也是這樣的:

1.尋找類文件。
這裏的靈活性比較大,我們可以自己去設計如何去尋找類文件以及去哪裏尋找類文件。比如一些非本地的類文件,通過系統的類加載器無法加載到這些類,這個時候,我們就可以利用自定義的類加載器指定路徑去尋找。
2.加載類文件。
找到我們所要加載的類之後,通過MyClassLoader的defineClass()方法,把這個類加載到指定的內存中。這裏我們可以自己設定存儲類的內存空間,比如把我們加載的類都統一放到一個變量數組裏(至於系統的類加載到內存中是以什麼樣的形式存儲再內存中的,我還不清楚,只知道是以二進制的形式保存的,可以用一個Class對象去引用)。
3.創建類對象。
我接觸的時候還不大理解,其實這裏是應用我們自己加載到內存中的類,去實例化一個對象。以下代碼可以參考:

import java.net.MalformedURLException;
import java.net.URL;

class MyClassLoader {
    
public static void main(String[] args) throws MalformedURLException,
            ClassNotFoundException 
{
        URL url1 
= new URL("file:/d:/workspace/");
        
// 指定路徑,相當於classpath的意思。
        myClassLoader myClassLoader = new MyClassLoader(new URL[] { url1 });
        
// 用這個路徑創建一個myClassLoader對象。這裏隨你所定義的ClassLoader而定。
        Class c1 = myClassLoader.loadClass("Student");
        
// 用自定義的類加載器,去顯式的加載一個類。返回一個Class對象。
        Student stu = c1.newInstance();
        
// 用這個Class對象就可以產生一個ClassLoaderTest的實例。
    }

}
發佈了12 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章