国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

ClassLoader介紹

瀏覽:61日期:2024-07-20 11:09:18
內容: JVM在運行時會產生三個ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.其中,Bootstrap是用C++編寫的,我們在Java中看不到它,是null。它用來加載核心類庫,在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啟動的時候就自動加載了,并且在運行過程中根本不能修改Bootstrap加載路徑。Extension ClassLoader用來加載擴展類,即/lib/ext中的類。最后AppClassLoader才是加載Classpath的。ClassLoader加載類用的是委托模型。即先讓Parent類(而不是Super,不是繼承關系)尋找,Parent找不到才自己找。看來ClassLoader還是蠻孝順的。三者的關系為:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent為Bootstrap ClassLoader。加載一個類時,首先BootStrap先進行尋找,找不到再由ExtClassLoader尋找,最后才是AppClassLoader。為什么要設計的這么復雜呢?其中一個重要原因就是安全性。比如在Applet中,如果編寫了一個java.lang.String類并具有破壞性。假如不采用這種委托機制,就會將這個具有破壞性的String加載到了用戶機器上,導致破壞用戶安全。但采用這種委托機制則不會出現這種情況。因為要加載java.lang.String類時,系統最終會由Bootstrap進行加載,這個具有破壞性的String永遠沒有機會加載。我們來看這段代碼://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中,則打印出[email protected]$AppClassLoader@92e78c可見都是由AppClassLoader來加載的。2、我們將其放在%jre%/lib/ext/classes(即ExtClassLoader的加載目錄。其加載/lib/ext中的jar文件或者子目錄classes中的class文件)中。則會打印出:sun.misc.Launcher$ExtClassLoadersun.misc.Launcher$ExtClassLoader3、我們將A.class放到%jre%/lib/ext/classes中,而將B.class放到classpaht中又會怎么樣呢?結果是:sun.misc.Launcher$ExtClassLoaderException in thread 'main' java.lang.NoClassDefFoundError:Bat A.main(A.java:6)怎么會這樣呢?這其中有一個重要的問題:A類當然是由ExtClassLoader來加載的,B類要由哪個加載呢?B類要由調用它自己的類的類加載器(真拗口)。也就是說,A調用了B,所以B由A的類加載器ExtClassLoader來加載。ExtClassLoader根據委托機制,先拜托Bootstrap加載,Bootstrap沒有找到。然后它再自己尋找B類,還是沒找到,所以拋出異常。ExtClassLoader不會請求AppClassLoader來加載!你可能會想:這算什么問題,我把兩個類放到一起不就行了?呵呵,沒這么簡單。比如JDBC是核心類庫,而各個數據庫的JDBC驅動則是擴展類庫或在classpath中定義的。所以JDBC由Bootstrap ClassLoader加載,而驅動要由AppClassLoader加載。等等,問題來了,Bootstrap不會請求AppClassLoader加載類啊。那么,他們怎么實現的呢?我就涉及到一個Context ClassLoader的問題,調用Thread.getContextClassLoader。具體我還沒搞太明白,要知后事如何,請聽下回分解!(啊!別拿磚頭砸我...)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
相關文章:
主站蜘蛛池模板: 免费中文字幕一级毛片 | 欧美一级毛片免费大片 | 国产美女在线精品亚洲二区 | 尤物蜜芽福利国产污在线观看 | 福利片免费一区二区三区 | 日本三级成人午夜视频网 | 日本在线观看免费视频 | 欧美一级www| 三级网站免费观看 | 日韩美女大全视频在线 | 日本a级精品一区二区三区 日本a级毛片免费视频播放 | 99久久99热久久精品免费看 | 自拍一区在线观看 | 国产午夜精品理论片 | 国产一区二区久久精品 | 国产自一区 | 亚洲女精品一区二区三区 | 国产亚洲人成网站在线观看不卡 | 亚洲精品无码不卡在线播放he | 国产成在线观看免费视频成本人 | 久草视频资源在线观看 | 亚洲男人的天堂久久香蕉网 | 成人毛片免费视频播放 | 九九久久精品视频 | 爱爱爱久久久久久久 | 欧美一级片免费在线观看 | 日本加勒比在线播放 | 国产成人亚洲合集青青草原精品 | 精品国产一区二区三区四区不 | 欧美色成人 | 久久免费公开视频 | 亚洲综合亚洲 | 久久中文字幕在线观看 | 亚色成人| 免费观看欧美一级高清 | 国产黄色片在线免费观看 | 欧美在线综合视频 | 亚洲国产成人精品一区二区三区 | 欧产日产国产精品精品 | 男女朋友做爽爽爽免费视频网 | 欧美精品一二区 |