<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    關于java class loader的理解筆記

    Posted on 2007-04-03 12:27 久城 閱讀(2529) 評論(3)  編輯  收藏 所屬分類: Java理解筆記

    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的實例。
        }

    }

    正在學習中,理解的還不夠準確。保持更新。

    歡迎來訪!^.^!
    本BLOG僅用于個人學習交流!
    目的在于記錄個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Feedback

    # re: 關于java class loader的理解筆記  回復  更多評論   

    2007-04-11 14:27 by Web 2.0 技術資源
    好玩!!!!!!!!

    # re: 關于java class loader的理解筆記  回復  更多評論   

    2007-04-16 19:18 by liji
    猴子的粑粑 ---緣分啊!
    這都能碰到,這么短的時間你就能理解到這個層次,佩服:D 你太有才了,呵呵,學習 - -

    # re: 關于java class loader的理解筆記[未登錄]  回復  更多評論   

    2008-11-05 22:59 by Scott
    AppClassLoader首先會到classpath下去尋找Student.class文件,應該是AppClassLoader會調用父loader去加載,沒加載到的話才會由AppClassLoader去加載, JDK doc 引用如下:


    The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader. When called upon to find a class or resource, a ClassLoader instance will delegate the search for the class or resource to its parent class loader before attempting to find the class or resource itself. The virtual machine's built-in class loader, called the bootstrap class loader, does not itself have a parent but may serve as the parent of a ClassLoader instance

    Copyright © 久城

    主站蜘蛛池模板: 亚洲国产成人精品无码区花野真一| 亚洲无线码一区二区三区| 亚洲av无码一区二区三区天堂古代| 无码国产精品一区二区免费vr | 日韩色日韩视频亚洲网站| 久久WWW免费人成人片| 亚洲欧美成人av在线观看| 女人张开腿等男人桶免费视频| 国产精品亚洲四区在线观看| 最近中文字幕mv免费高清视频7 | 一级成人a毛片免费播放| 久久狠狠高潮亚洲精品| 最近免费中文在线视频| 亚洲乱码日产精品BD在线观看| 中国在线观看免费高清完整版| 亚洲中文字幕无码久久2020 | 亚洲精品蜜桃久久久久久| 国内精品久久久久影院免费 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲综合久久久久久中文字幕| 日韩版码免费福利视频| 久久综合久久综合亚洲| 四虎影视永久免费观看网址 | 99久久婷婷国产综合亚洲| 四虎影院免费视频| 黄色网址大全免费| 亚洲成av人在线视| 国产91免费在线观看| 美女被免费视频网站a| 亚洲三区在线观看无套内射| 亚洲精品视频在线免费| 亚洲AV成人精品一区二区三区| 国产亚洲精aa成人网站| 黄色免费网站网址| 日韩毛片免费一二三| 亚洲视频在线播放| 国产免费怕怕免费视频观看| 国色精品va在线观看免费视频 | 国产免费拔擦拔擦8x| 国产成人AV片无码免费| 亚洲精品无码成人|