av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

ClassLoader介紹

瀏覽:93日期:2024-07-20 11:09:18
內(nèi)容: JVM在運(yùn)行時(shí)會(huì)產(chǎn)生三個(gè)ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.其中,Bootstrap是用C++編寫的,我們?cè)贘ava中看不到它,是null。它用來(lái)加載核心類庫(kù),在JVM源代碼中這樣寫道:static const char classpathFormat[] ='%/lib/rt.jar:''%/lib/i18n.jar:''%/lib/sunrsasign.jar:''%/lib/jsse.jar:''%/lib/jce.jar:''%/lib/charsets.jar:''%/classes';知道為什么不需要在classpath中加載這些類了吧?人家在JVM啟動(dòng)的時(shí)候就自動(dòng)加載了,并且在運(yùn)行過(guò)程中根本不能修改Bootstrap加載路徑。Extension ClassLoader用來(lái)加載擴(kuò)展類,即/lib/ext中的類。最后AppClassLoader才是加載Classpath的。ClassLoader加載類用的是委托模型。即先讓Parent類(而不是Super,不是繼承關(guān)系)尋找,Parent找不到才自己找。看來(lái)ClassLoader還是蠻孝順的。三者的關(guān)系為:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent為Bootstrap ClassLoader。加載一個(gè)類時(shí),首先BootStrap先進(jìn)行尋找,找不到再由ExtClassLoader尋找,最后才是AppClassLoader。為什么要設(shè)計(jì)的這么復(fù)雜呢?其中一個(gè)重要原因就是安全性。比如在Applet中,如果編寫了一個(gè)java.lang.String類并具有破壞性。假如不采用這種委托機(jī)制,就會(huì)將這個(gè)具有破壞性的String加載到了用戶機(jī)器上,導(dǎo)致破壞用戶安全。但采用這種委托機(jī)制則不會(huì)出現(xiàn)這種情況。因?yàn)橐虞djava.lang.String類時(shí),系統(tǒng)最終會(huì)由Bootstrap進(jìn)行加載,這個(gè)具有破壞性的String永遠(yuǎn)沒(méi)有機(jī)會(huì)加載。我們來(lái)看這段代碼://A.javapublic class A{public static void main(String[] args){A a=new A();System.out.println(System.getProperty('java.ext.dirs'));System.out.println(a.getClass().getClassLoader());B b=new B();b.print();}}//B.javapublic class B{public void print(){System.out.println(this.getClass().getClassLoader());}}1、我們將它放在Classpath中,則打印出sun.misc.Launcher$AppClassLoader@92e78csun.misc.Launcher$AppClassLoader@92e78c可見(jiàn)都是由AppClassLoader來(lái)加載的。2、我們將其放在%jre%/lib/ext/classes(即ExtClassLoader的加載目錄。其加載/lib/ext中的jar文件或者子目錄classes中的class文件)中。則會(huì)打印出:sun.misc.Launcher$ExtClassLoadersun.misc.Launcher$ExtClassLoader3、我們將A.class放到%jre%/lib/ext/classes中,而將B.class放到classpaht中又會(huì)怎么樣呢?結(jié)果是:sun.misc.Launcher$ExtClassLoaderException in thread 'main' java.lang.NoClassDefFoundError:Bat A.main(A.java:6)怎么會(huì)這樣呢?這其中有一個(gè)重要的問(wèn)題:A類當(dāng)然是由ExtClassLoader來(lái)加載的,B類要由哪個(gè)加載呢?B類要由調(diào)用它自己的類的類加載器(真拗口)。也就是說(shuō),A調(diào)用了B,所以B由A的類加載器ExtClassLoader來(lái)加載。ExtClassLoader根據(jù)委托機(jī)制,先拜托Bootstrap加載,Bootstrap沒(méi)有找到。然后它再自己尋找B類,還是沒(méi)找到,所以拋出異常。ExtClassLoader不會(huì)請(qǐng)求AppClassLoader來(lái)加載!你可能會(huì)想:這算什么問(wèn)題,我把兩個(gè)類放到一起不就行了?呵呵,沒(méi)這么簡(jiǎn)單。比如JDBC是核心類庫(kù),而各個(gè)數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)則是擴(kuò)展類庫(kù)或在classpath中定義的。所以JDBC由Bootstrap ClassLoader加載,而驅(qū)動(dòng)要由AppClassLoader加載。等等,問(wèn)題來(lái)了,Bootstrap不會(huì)請(qǐng)求AppClassLoader加載類啊。那么,他們?cè)趺磳?shí)現(xiàn)的呢?我就涉及到一個(gè)Context ClassLoader的問(wèn)題,調(diào)用Thread.getContextClassLoader。具體我還沒(méi)搞太明白,要知后事如何,請(qǐng)聽(tīng)下回分解!(啊!別拿磚頭砸我...)from-javaresearch.org Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
相關(guān)文章:
主站蜘蛛池模板: 国产无套一区二区三区久久 | 岛国视频 | 黄色欧美视频 | 一级毛片视频在线 | 久久亚洲一区二区三区四区 | 国产精成人| 国产精品高潮呻吟久久aⅴ码 | 日本视频中文字幕 | 69福利影院 | 国产精品明星裸体写真集 | 日韩欧美在线观看 | av片免费观看 | 精品国产乱码久久久久久丨区2区 | 福利视频一区二区 | 亚洲黄色av | 国产亚洲精品综合一区 | 久草新在线| 亚洲成人二区 | 三级视频在线观看电影 | 亚洲精品乱码 | 毛片1| 91在线观看| 国产精品不卡一区 | 亚洲综合大片69999 | 蜜臀久久99精品久久久久野外 | 久久亚洲国产 | 欧美成人精品一区二区三区 | 亚洲一区二区三区视频在线 | 国产一区二区三区视频在线观看 | 最新黄色在线观看 | 狠狠干在线 | 中文字幕91 | 免费黄色av | a a毛片| 91精品国产综合久久久久久 | 日韩免费福利视频 | 精品免费国产一区二区三区 | 国产精品一区在线 | 亚洲欧美一区二区三区1000 | 日日精品 | 九九综合 |