類加載器總結(jié)
很早時(shí)就關(guān)注了classloader,但一直沒有總結(jié)
1.classloader是樹形結(jié)構(gòu)。
bootstrap Class Loaders負(fù)責(zé)裝載java.*下的基本類
extension Class Loaders負(fù)責(zé)裝載javax.*下的類
system Class Loaders負(fù)責(zé)系統(tǒng)(用戶)實(shí)現(xiàn)的類
三者的關(guān)系是
bootstrap class loaders是extension class loaders的父親
extension class loaders是system class loaders的父親
2.class loader的裝載機(jī)制是parent delegate的模型。類的裝載是委托給父class loader去查找,如果沒有找到才用當(dāng)前的class loader來查找。
3.不同的classLoader加載同一個(gè)類,實(shí)例是不同的,拋出castclassException
4.Class.forName是從指定的classloader中裝載類,如果沒有指定,也就是一個(gè)參數(shù)的時(shí)候,是從裝載當(dāng)前對(duì)象實(shí)例所在的classloader中裝載類. 而ClassLoader的實(shí)例調(diào)用loadclass方法,是指從當(dāng)前ClassLoader實(shí)例中調(diào)用類,而這個(gè)實(shí)例與裝載當(dāng)前所在類實(shí)例的Classloader也許不是同一個(gè). 舉個(gè)例子吧, 有A,B , C兩個(gè)ClassLoader , 當(dāng)前運(yùn)行的類D的實(shí)例是d(裝載它的是A) , 如果D中使用Class.forName那么就是使用的ClassLoader就是A,當(dāng)然,也可以指定為B. 而如果D中代碼找到的ClassLoader實(shí)例是C,那么就是用D來裝載所指定的類.
5.Thread.currentThread().getContextClassLoader().loadClass("className"),采用當(dāng)前線程的類加載器
比如:



2

3



4

5

6

7

8

9


回答:大多數(shù)情況下,是一樣的,但是如果不改變 Thread的ClassLoader ,那么是否也是一樣的呢?
考慮Java多線程應(yīng)用,執(zhí)行類A的方法體B中采用Tread的方式獲得classloader是調(diào)用者的類加載器。而class.forname是加載當(dāng)前類的也就是類A的類加載器。這兩種情況下是可能不一致的。
在spring的環(huán)境下,類C中的類A實(shí)例通過依賴注入,如果采用Class.forName則Class B是IoC容器的類加載器;如果采用thread的話,則類加載器和加載類C的一樣
posted on 2007-06-21 16:17 Jhonney 閱讀(255) 評(píng)論(0) 編輯 收藏