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

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

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

    隨筆 - 154  文章 - 60  trackbacks - 0
    <2007年9月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    聲明:

    該blog是為了收集資料,認(rèn)識(shí)朋友,學(xué)習(xí)、提高技術(shù),所以本blog的內(nèi)容除非聲明,否則一律為轉(zhuǎn)載!!

    感謝那些公開(kāi)自己技術(shù)成果的高人們!!!

    支持開(kāi)源,尊重他人的勞動(dòng)!!

    常用鏈接

    留言簿(3)

    隨筆分類(148)

    隨筆檔案(143)

    收藏夾(2)

    其他

    學(xué)習(xí)(技術(shù))

    觀察思考(非技術(shù))

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    也是無(wú)意間找到的,以前從沒(méi)仔細(xì)想過(guò)底層的問(wèn)題,看后才發(fā)現(xiàn)要學(xué)得太多太多,學(xué)習(xí)!學(xué)習(xí)!再學(xué)習(xí)!
     

       java中的類是動(dòng)態(tài)加載的,我們先看一下我們常用的類加載方式,先有一個(gè)感性的認(rèn)識(shí),才能進(jìn)一步
    深入討論,類加載無(wú)非就是下面三種方式。
    class A{}
    class B{}
    class C{}
    public class Loader{
        public static void main(String[] args) throws Exception{
           Class aa=A.class;
           Class bb=Class.forName("B");
           Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
        }
    }

    我們先看.class字面量方式,很多人可能不知道這種方式,因?yàn)檫@種用法不是一般java語(yǔ)法。
    通過(guò)javap我們可以發(fā)現(xiàn),這種方式的大致等價(jià)于定義了一個(gè)靜態(tài)成員變量
        static Class class$0;(后面的編號(hào)是增長(zhǎng)的)
    你可以試圖再定義一個(gè)  static Class class$0,應(yīng)該會(huì)收到一個(gè)編譯錯(cuò)誤(重復(fù)定義)。
    Class aa=A.class;
    就相當(dāng)于

        if(class$0==null){
     try{
               Class.forName("A");
     }
     cacth(ClassNotFoundException e){
        throw new NoClassDefFoundError(e);
     }
        }
        Class aa=class$0;
        可以很清楚的看到,這種類的字面量定義其實(shí)不是加載類的方式,而是被編譯器處理了,實(shí)質(zhì)上是使用了Class.forName方法,但是使用這種方式有一個(gè)很大的好處就是不用處理異常,因?yàn)榫幾g器處理的時(shí)候如果找不到類會(huì)拋出一個(gè)NoClassDefFoundError.也許你覺(jué)得需要處理ClassNotFoundException這種異常,事實(shí)上99%的情況下我們可以把這種異常認(rèn)為是一個(gè)錯(cuò)誤。
        所以大部分情況我們使用這種方式會(huì)更簡(jiǎn)潔。
        最常用的方式就是Class.forName方式了,這也是一個(gè)通用的上層調(diào)用。這個(gè)方法有兩個(gè)重載,可能很多人都忽略了第二個(gè)方法。
    public static Class forName(String name) throws ClassNotFoundException
    public static Class forName(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException

    第二個(gè)方法后面多了兩個(gè)參數(shù),第二個(gè)參數(shù)表示是否初始化,第三個(gè)參數(shù)為指定的類加載器。
    在上面的例子中:
    Class bb=Class.forName("B");
    等價(jià)于
    Class bb=Class.forName("B",true,Loader.class.getClassLoader());

        這里要詳細(xì)說(shuō)一下這個(gè)類的初始化這個(gè)參數(shù),如果這個(gè)參數(shù)為false的話,類中的static成員不會(huì)被初始化,static語(yǔ)句塊也不會(huì)被執(zhí)行。
        也就是類雖然被加載了,但是沒(méi)有被初始化,不過(guò)在第一次使用時(shí)仍然會(huì)初始化。
        所以我們有時(shí)候會(huì)看到Class.forName("XXX")。newInstance()這樣的語(yǔ)句,為什么這里要?jiǎng)?chuàng)建一個(gè)不用的實(shí)例呢?不過(guò)是為了保證類被初始化(兼容以前的系統(tǒng))。
        其實(shí)第二個(gè)方法是比較難用的,需要指定類加載器,如果不指定而且又沒(méi)有安裝安全管理器的化,是無(wú)法加載類的,只要看一下具體的實(shí)現(xiàn)就明白了。
        最本質(zhì)的方式當(dāng)然是直接使用ClassLoader加載了,所有的類最終都是通過(guò)ClassLoader加載的,Class cc=ClassLoader.getSystemClassLoader()。loadClass("C");這里通過(guò)使用系統(tǒng)類加載器來(lái)加載某個(gè)類,很直接的方式,但是很遺憾的是通過(guò)這種方式加載類,類是沒(méi)有被初始化的(也就是初始化被延遲到真正使用的時(shí)候)。不過(guò)我們也可以借鑒上面的經(jīng)驗(yàn),加載后實(shí)例化一個(gè)對(duì)象Class cc=ClassLoader.getSystemClassLoader()。loadClass("C")。newInstance()。
        這里使用了系統(tǒng)類加載器,也是最常用的類加載器,從classpath中尋找要加載的類。
        java中默認(rèn)有三種類加載器:引導(dǎo)類加載器,擴(kuò)展類加載器,系統(tǒng)類加載器。
        java中的類加載有著規(guī)范的層次結(jié)構(gòu),如果我們要了解類加載的過(guò)程,需要明確知道哪個(gè)類被誰(shuí)加載,某個(gè)類加載器加載了哪些類等等,就需要深入理解ClassLoader的本質(zhì)。
        以上只是類加載的表面的東西,我們還將討論深層次的東西。

    posted on 2007-09-25 11:05 lk 閱讀(136) 評(píng)論(0)  編輯  收藏 所屬分類: j2se
    主站蜘蛛池模板: 亚洲成a人片7777| 麻豆69堂免费视频| 在线看片无码永久免费aⅴ| 人体大胆做受免费视频| 亚洲人成影院在线| 免费萌白酱国产一区二区| 国产成人一区二区三区视频免费 | 亚洲国产精品尤物YW在线观看| 最近中文字幕大全免费版在线| 亚洲乱码在线视频| 国产午夜亚洲不卡| 日韩欧美一区二区三区免费观看| 一级中文字幕免费乱码专区| 亚洲成人动漫在线观看| 在线精品亚洲一区二区三区| 男人的好免费观看在线视频| 四虎影视无码永久免费| 国产精品亚洲专一区二区三区| 亚洲av色福利天堂| 亚洲国产专区一区| 毛片免费视频观看| 久久免费视频网站| 美女被羞羞网站免费下载| 91亚洲精品自在在线观看| 亚洲国产另类久久久精品小说| 免费精品一区二区三区在线观看| 99视频免费播放| 又大又硬又粗又黄的视频免费看| 亚洲日韩精品无码AV海量| 亚洲国产精品va在线播放| 免费a级毛片无码av| 日韩免费a级毛片无码a∨| 国产午夜精品理论片免费观看| 亚洲1区2区3区精华液| 亚洲最大在线视频| 久久久久久亚洲精品| 狠狠亚洲狠狠欧洲2019| 免费二级毛片免费完整视频| 在线观看无码的免费网站| 国产92成人精品视频免费| 国产精成人品日日拍夜夜免费|