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

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

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

    關(guān)于java class loader的理解筆記

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

    JAVA中的一切都是以類的形式存在的(除少數(shù)底層的東西,那些我就不清楚是怎么回事了)。我們運(yùn)行的接口是一個(gè)類,運(yùn)行中所涉及到的對(duì)象也都是類對(duì)象。下面,我們來(lái)研究下,我所理解的類的加載機(jī)制。

    比如我們有一個(gè)Student類,也就是經(jīng)過(guò)編譯后,是一個(gè)Student.class文件。當(dāng)我們的程序運(yùn)行的過(guò)程中,第一次實(shí)例化一個(gè)student對(duì)象的時(shí)候,系統(tǒng)首先要做的就是加載Student這個(gè)類。也就是把Student.class以字節(jié)瑪?shù)男蝿?shì)加載到內(nèi)存中(并通過(guò)defineClass()這個(gè)方法轉(zhuǎn)變成Class對(duì)象,最終以Class對(duì)象的形式存儲(chǔ)在內(nèi)存中)。這個(gè)加載的過(guò)程就是由類加載器來(lái)完成的。

    一般的,在程序啟動(dòng)之后,系統(tǒng)會(huì)主要會(huì)有三個(gè)類加載器:Bootstrap Loader、ExtClassLoader與AppClassLoader。

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

    簡(jiǎn)單的說(shuō),Bootstrap Loader、ExtClassLoader這兩個(gè)類加載器,主要是加載系統(tǒng)類庫(kù)里的類。我們自己編輯的類一般都是由AppClassLoader來(lái)加載。當(dāng)我們遇到如下代碼的時(shí)候:

    Student stu  = new Student();
    //實(shí)例化一個(gè)Student類的對(duì)象stu

    AppClassLoader首先會(huì)到classpath下去尋找Student.class文件。(找不到則會(huì)拋出ClassNotFoundException異常)找到之后便會(huì)把Student這個(gè)類以二進(jìn)制的形式存儲(chǔ)到內(nèi)存中。這個(gè)過(guò)程也就是對(duì)Student類加載的過(guò)程。然后用我們加載到內(nèi)存中的Student類去實(shí)例化一個(gè)Student對(duì)象stu。

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

    1.尋找類文件。
    這里的靈活性比較大,我們可以自己去設(shè)計(jì)如何去尋找類文件以及去哪里尋找類文件。比如一些非本地的類文件,通過(guò)系統(tǒng)的類加載器無(wú)法加載到這些類,這個(gè)時(shí)候,我們就可以利用自定義的類加載器指定路徑去尋找。
    2.加載類文件。
    找到我們所要加載的類之后,通過(guò)MyClassLoader的defineClass()方法,把這個(gè)類加載到指定的內(nèi)存中。這里我們可以自己設(shè)定存儲(chǔ)類的內(nèi)存空間,比如把我們加載的類都統(tǒng)一放到一個(gè)變量數(shù)組里(至于系統(tǒng)的類加載到內(nèi)存中是以什么樣的形式存儲(chǔ)再內(nèi)存中的,我還不清楚,只知道是以二進(jìn)制的形式保存的,可以用一個(gè)Class對(duì)象去引用)。
    3.創(chuàng)建類對(duì)象。
    我接觸的時(shí)候還不大理解,其實(shí)這里是應(yīng)用我們自己加載到內(nèi)存中的類,去實(shí)例化一個(gè)對(duì)象。以下代碼可以參考:

    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/");
            
    // 指定路徑,相當(dāng)于classpath的意思。
            myClassLoader myClassLoader = new MyClassLoader(new URL[] { url1 });
            
    // 用這個(gè)路徑創(chuàng)建一個(gè)myClassLoader對(duì)象。這里隨你所定義的ClassLoader而定。
            Class c1 = myClassLoader.loadClass("Student");
            
    // 用自定義的類加載器,去顯式的加載一個(gè)類。返回一個(gè)Class對(duì)象。
            Student stu = c1.newInstance();
            
    // 用這個(gè)Class對(duì)象就可以產(chǎn)生一個(gè)ClassLoaderTest的實(shí)例。
        }

    }

    正在學(xué)習(xí)中,理解的還不夠準(zhǔn)確。保持更新。

    歡迎來(lái)訪!^.^!
    本BLOG僅用于個(gè)人學(xué)習(xí)交流!
    目的在于記錄個(gè)人成長(zhǎng).
    所有文字均屬于個(gè)人理解.
    如有錯(cuò)誤,望多多指教!不勝感激!

    Feedback

    # re: 關(guān)于java class loader的理解筆記  回復(fù)  更多評(píng)論   

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

    # re: 關(guān)于java class loader的理解筆記  回復(fù)  更多評(píng)論   

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

    # re: 關(guān)于java class loader的理解筆記[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-11-05 22:59 by Scott
    AppClassLoader首先會(huì)到classpath下去尋找Student.class文件,應(yīng)該是AppClassLoader會(huì)調(diào)用父loader去加載,沒(méi)加載到的話才會(huì)由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 © 久城

    主站蜘蛛池模板: 一级毛片成人免费看a| 免费特级黄毛片在线成人观看| 亚洲色图在线播放| 羞羞漫画页面免费入口欢迎你| 在线观看视频免费完整版| 国产AV无码专区亚洲AV麻豆丫| 国色精品卡一卡2卡3卡4卡免费| 国产精品亚洲а∨无码播放| 无码人妻一区二区三区免费| 国产区在线免费观看| 亚洲AV无码成H人在线观看| 青青青国产手机频在线免费观看| 亚洲色中文字幕在线播放| 亚洲色大成网站WWW久久九九| 免费无码肉片在线观看| 国产在线国偷精品免费看| 国产亚洲综合久久系列| 成年女人免费视频播放体验区| 亚洲最大中文字幕无码网站| 亚洲桃色AV无码| 日韩免费毛片视频| 看亚洲a级一级毛片| 亚洲国产成人综合| 9久9久女女免费精品视频在线观看| 丰满少妇作爱视频免费观看| 在线亚洲午夜片AV大片| 久久久久亚洲AV成人无码| 亚洲成a人片在线观看日本麻豆| 亚色九九九全国免费视频| 永久在线观看免费视频| 亚洲视频免费一区| 国产亚洲av人片在线观看| 日本黄色动图免费在线观看| 免费VA在线观看无码| 亚洲一区二区无码偷拍| 亚洲最大黄色网址| 亚洲AV日韩AV永久无码下载| 国产成人精品曰本亚洲79ren| 国产精品免费小视频| 毛片免费观看网址| 免费视频专区一国产盗摄|