Jhonney的專欄

             ----人見人愛
          隨筆 - 49, 文章 - 1, 評論 - 23, 引用 - 0
          數(shù)據(jù)加載中……

          類加載器總結(jié)

          很早時就關(guān)注了classloader,但一直沒有總結(jié)
          1.classloader是樹形結(jié)構(gòu)。
                   bootstrap Class Loaders負責(zé)裝載java.*下的基本類 
                   extension Class Loaders負責(zé)裝載javax.*下的類 
                   system Class Loaders負責(zé)系統(tǒng)(用戶)實現(xiàn)的類

                   三者的關(guān)系是 
                   bootstrap class loaders是extension class loaders的父親 
                   extension class loaders是system class loaders的父親
          2.class loader的裝載機制是parent delegate的模型。類的裝載是委托給父class loader去查找,如果沒有找到才用當(dāng)前的class loader來查找。
          3.不同的classLoader加載同一個類,實例是不同的,拋出castclassException
          4.Class.forName是從指定的classloader中裝載類,如果沒有指定,也就是一個參數(shù)的時候,是從裝載當(dāng)前對象實例所在的classloader中裝載類. 而ClassLoader的實例調(diào)用loadclass方法,是指從當(dāng)前ClassLoader實例中調(diào)用類,而這個實例與裝載當(dāng)前所在類實例的Classloader也許不是同一個. 舉個例子吧, 有A,B , C兩個ClassLoader , 當(dāng)前運行的類D的實例是d(裝載它的是A) , 如果D中使用Class.forName那么就是使用的ClassLoader就是A,當(dāng)然,也可以指定為B. 而如果D中代碼找到的ClassLoader實例是C,那么就是用D來裝載所指定的類.
          5.Thread.currentThread().getContextClassLoader().loadClass("className"),采用當(dāng)前線程的類加載器
          比如:

          1class A{
          2..
          3   public void test(){
          4   ..
          5   Class B =Thread.currentThread().getContextClassLoader().loadClass("className");
          6   ..
          7  }

          8..
          9}
          如果將第5行中的的語句換成
          1Class B=Class.forName("className"
          這兩種情況下calss B是一致的么?
          回答:大多數(shù)情況下,是一樣的,但是如果不改變 Thread的ClassLoader ,那么是否也是一樣的呢?
          考慮Java多線程應(yīng)用,執(zhí)行類A的方法體B中采用Tread的方式獲得classloader是調(diào)用者的類加載器。而class.forname是加載當(dāng)前類的也就是類A的類加載器。這兩種情況下是可能不一致的。
          在spring的環(huán)境下,類C中的類A實例通過依賴注入,如果采用Class.forName則Class B是IoC容器的類加載器;如果采用thread的話,則類加載器和加載類C的一樣

          posted on 2007-06-21 16:17 Jhonney 閱讀(258) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 东阳市| 乌兰察布市| 沙湾县| 宿松县| 莎车县| 鹤壁市| 合水县| 孟津县| 夏邑县| 六枝特区| 巴里| 九龙坡区| 拉萨市| 库伦旗| 千阳县| 白沙| 普定县| 永仁县| 扶沟县| 莆田市| 平遥县| 会东县| 沅陵县| 偏关县| 马尔康县| 凤阳县| 和硕县| 集贤县| 五家渠市| 青田县| 石渠县| 东至县| 灌南县| 福贡县| 张家口市| 瑞金市| 华安县| 宜都市| 安仁县| 会理县| 衡阳县|