九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
ClassLoader介紹
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ì)加載。 bitsCN.nET*中國(guó)網(wǎng)管博客
  我們來(lái)看這段代碼:
  [code]//A.java
  public 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.java
  public class B{
  public void print(){
  System.out.println(this.getClass().getClassLoader());
  }
  }[/code]
  
  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 [bitsCN_com]
  at 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。
本文來(lái)自: 中國(guó)網(wǎng)管聯(lián)盟(bitsCN.com) 詳細(xì)出處參考:http://www.bitscn.com/java/other/200605/23751.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
類加載器機(jī)器委托機(jī)制的深入
一看你就懂,Java中的ClassLoader詳解
Java ClassLoader基礎(chǔ)知識(shí)(網(wǎng)上內(nèi)容整理后所得)
一個(gè)Java程序的執(zhí)行過(guò)程
Classloader總結(jié)
classLoader動(dòng)態(tài)加載
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服