国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

ClassLoader介紹

2019-11-18 11:03:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 


JVM在運(yùn)行時(shí)會(huì)產(chǎn)生三個(gè)ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.其中,Bootstrap是用C++編寫(xiě)的,我們?cè)?a href="http://m.survivalescaperooms.com/article.asp?typeid=160">java中看不到它,是null。它用來(lái)加載核心類(lèi)庫(kù),在JVM源代碼中這樣寫(xiě)道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
知道為什么不需要在classpath中加載這些類(lèi)了吧?人家在JVM啟動(dòng)的時(shí)候就自動(dòng)加載了,并且在運(yùn)行過(guò)程中根本不能修改Bootstrap加載路徑。Extension ClassLoader用來(lái)加載擴(kuò)展類(lèi),即/lib/ext中的類(lèi)。最后AppClassLoader才是加載Classpath的。ClassLoader加載類(lèi)用的是委托模型。即先讓Parent類(lèi)(而不是Super,不是繼續(xù)關(guān)系)尋找,Parent找不到才自己找。看來(lái)ClassLoader還是蠻孝順的。三者的關(guān)系為:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent為Bootstrap ClassLoader。加載一個(gè)類(lèi)時(shí),首先BootStrap先進(jìn)行尋找,找不到再由ExtClassLoader尋找,最后才是AppClassLoader。
為什么要設(shè)計(jì)的這么復(fù)雜呢?其中一個(gè)重要原因就是安全性。比如在Applet中,假如編寫(xiě)了一個(gè)java.lang.String類(lèi)并具有破壞性。假如不采用這種委托機(jī)制,就會(huì)將這個(gè)具有破壞性的String加載到了用戶機(jī)器上,導(dǎo)致破壞用戶安全。但采用這種委托機(jī)制則不會(huì)出現(xiàn)這種情況。因?yàn)橐虞djava.lang.String類(lèi)時(shí),系統(tǒng)最終會(huì)由Bootstrap進(jìn)行加載,這個(gè)具有破壞性的String永遠(yuǎn)沒(méi)有機(jī)會(huì)加載。
我們來(lái)看這段代碼:
//A.java
public class A{
public static void main(String[] args){
A a=new A();
System.out.System.out.println(a.getClass().getClassLoader());
B b=new B();
b.print();
}
}
//B.java
public class B{
public void print(){
System.out.println(this.getClass().getClassLoader());
}
}
1、我們將它放在Classpath中,則打印出
sun.misc.Launcher$AppClassLoader@92e78c
sun.misc.Launcher$AppClassLoader@92e78c
可見(jiàn)都是由AppClassLoader來(lái)加載的。
2、我們將其放在%jre%/lib/ext/classes(即ExtClassLoader的加載目錄。其加載/lib/ext中的jar文件或者子目錄classes中的class文件)中。則會(huì)打印出:
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$ExtClassLoader
3、我們將A.class放到%jre%/lib/ext/classes中,而將B.class放到classpaht中又會(huì)怎么樣呢?結(jié)果是:
sun.misc.Launcher$ExtClassLoader
Exception in thread "main" java.lang.NoClassDefFoundError:B
at A.main(A.java:6)
怎么會(huì)這樣呢?這其中有一個(gè)重要的問(wèn)題:A類(lèi)當(dāng)然是由ExtClassLoader來(lái)加載的,B類(lèi)要由哪個(gè)加載呢?B類(lèi)要由調(diào)用它自己的類(lèi)的類(lèi)加載器(真拗口)。也就是說(shuō),A調(diào)用了B,所以B由A的類(lèi)加載器ExtClassLoader來(lái)加載。ExtClassLoader根據(jù)委托機(jī)制,先拜托Bootstrap加載,Bootstrap沒(méi)有找到。然后它再自己尋找B類(lèi),還是沒(méi)找到,所以拋出異常。ExtClassLoader不會(huì)請(qǐng)求AppClassLoader來(lái)加載!你可能會(huì)想:這算什么問(wèn)題,我把兩個(gè)類(lèi)放到一起不就行了?呵呵,沒(méi)這么簡(jiǎn)單。比如JDBC是核心類(lèi)庫(kù),而各個(gè)
數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)則是擴(kuò)展類(lèi)庫(kù)或在classpath中定義的。所以JDBC由Bootstrap ClassLoader加載,而驅(qū)動(dòng)要由AppClassLoader加載。等等,問(wèn)題來(lái)了,Bootstrap不會(huì)請(qǐng)求AppClassLoader加載類(lèi)啊。那么,他們?cè)趺磳?shí)現(xiàn)的呢?我就涉及到一個(gè)Context ClassLoader的問(wèn)題,調(diào)用Thread.getContextClassLoader。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 法库县| 双牌县| 遂溪县| 驻马店市| 萨嘎县| 安吉县| 金湖县| 北碚区| 钟山县| 新化县| 新巴尔虎左旗| 塔河县| 山阳县| 虞城县| 南郑县| 富锦市| 晴隆县| 台东县| 新疆| 香港 | 和静县| 江孜县| 普兰县| 曲靖市| 武宁县| 灵宝市| 邵武市| 清新县| 梅州市| 抚州市| 丹东市| 金堂县| 松溪县| 柳林县| 北碚区| 搜索| 天镇县| 横峰县| 富民县| 汝城县| 龙里县|