JAVA及類加載器及工作原理_第1頁
JAVA及類加載器及工作原理_第2頁
JAVA及類加載器及工作原理_第3頁
JAVA及類加載器及工作原理_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、.類加載器的工作原理Java類加載器的作用就是在運(yùn)行時(shí)加載類。Java類加載器基于三個(gè)機(jī)制:委托、可見性和單一性。委托機(jī)制是指將加載一個(gè)類的請(qǐng)求交給父類加載 器,如果這個(gè)父類加載器不能夠找到或者加載這個(gè)類,那么再加載它??梢娦缘脑硎亲宇惖募虞d器可以看見所有的父類加載器加載的類,而父類加載器看不到子類 加載器加載的類。單一性原理是指僅加載一個(gè)類一次,這是由委托機(jī)制確保子類加載器不會(huì)再次加載父類加載器加載過的類。正確理解類加載器能夠幫你解決 NoClassDefFoundError和java.lang.ClassNotFoundException,因?yàn)樗鼈兒皖惖募虞d相關(guān)。類加載器通常 也是比較高

2、級(jí)的Java面試中的重要考題,Java類加載器和工作原理以及classpath如何運(yùn)作的經(jīng)常被問到。Java面試題中也經(jīng)常出現(xiàn)“一個(gè)類 是否能被兩個(gè)不同類加載器加載”這樣的問題。這篇教程中,我們將學(xué)到類加載器是什么,它的工作原理以及一些關(guān)于類加載器的知識(shí)點(diǎn)。什么是類加載器類加載器是一個(gè)用來加載類文件的類。Java源代碼通過javac編譯器編譯成類文件。然后JVM來執(zhí)行類文件中的字節(jié)碼來執(zhí)行程序。類加載器負(fù)責(zé) 加載文件系統(tǒng)、網(wǎng)絡(luò)或其他來源的類文件。有三種默認(rèn)使用的類加載器:Bootstrap類加載器、Extension類加載器和System類加載器(或 者叫作Application類加載器)。每

3、種類加載器都有設(shè)定好從哪里加載類。· Bootstrap類加載器負(fù)責(zé)加載rt.jar中的JDK類文件,它是所有類加載器的父加載器。Bootstrap類加載器沒有任何父類加載 器,如果你調(diào)用String.class.getClassLoader(),會(huì)返回null,任何基于此的代碼會(huì)拋出 NUllPointerException異常。Bootstrap加載器被稱為初始類加載器。· 而Extension將加載類的請(qǐng)求先委托給它的父加載器,也就是Bootstrap,如果沒有成功加載的話,再從jre/lib/ext目錄下 或者java.ext.dirs系統(tǒng)屬性定義的目錄下加載類。E

4、xtension加載器由 sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)。· 第三種默認(rèn)的加載器就是System類加載器(又叫作Application類加載器)了。它負(fù)責(zé)從classpath環(huán)境變量中加載某些應(yīng)用相 關(guān)的類,classpath環(huán)境變量通常由-classpath或-cp命令行選項(xiàng)來定義,或者是JAR中的Manifest的classpath屬性。 Application類加載器是Extension類加載器的子加載器。通過sun.misc.Launcher$AppClassLoader實(shí)現(xiàn)。除了Bootstrap類加載器是大部分由C來寫的,其他的類加載

5、器都是通過java.lang.ClassLoader來實(shí)現(xiàn)的??偨Y(jié)一下,下面是三種類加載器加載類文件的地方:1) Bootstrap類加載器 JRE/lib/rt.jar2) Extension類加載器 JRE/lib/ext或者java.ext.dirs指向的目錄3) Application類加載器 CLASSPATH環(huán)境變量, 由-classpath或-cp選項(xiàng)定義,或者是JAR中的Manifest的classpath屬性定義.類加載器的工作原理我之前已經(jīng)提到過了,類加載器的工作原理基于三個(gè)機(jī)制:委托、可見性和單一性。這一節(jié),我們來詳細(xì)看看這些規(guī)則,并用一個(gè)實(shí)例來理解工作原理。下面顯示的是

6、類加載器使用委托機(jī)制的工作原理。委托機(jī)制當(dāng)一個(gè)類加載和初始化的時(shí)候,類僅在有需要加載的時(shí)候被加載。假設(shè)你有一個(gè)應(yīng)用需要的類叫作Abc.class,首先加載這個(gè)類的請(qǐng)求由 Application類加載器委托給它的父類加載器Extension類加載器,然后再委托給Bootstrap類加載器。Bootstrap類加載器 會(huì)先看看rt.jar中有沒有這個(gè)類,因?yàn)椴]有這個(gè)類,所以這個(gè)請(qǐng)求由回到Extension類加載器,它會(huì)查看jre/lib/ext目錄下有沒有這 個(gè)類,如果這個(gè)類被Extension類加載器找到了,那么它將被加載,而Application類加載器不會(huì)加載這個(gè)類;而如果這個(gè)類沒有被 E

7、xtension類加載器找到,那么再由Application類加載器從classpath中尋找。記住classpath定義的是類文件的加載目 錄,而PATH是定義的是可執(zhí)行程序如javac,java等的執(zhí)行路徑??梢娦詸C(jī)制根據(jù)可見性機(jī)制,子類加載器可以看到父類加載器加載的類,而反之則不行。所以下面的例子中,當(dāng)Abc.class已經(jīng)被Application類加 載器加載過了,然后如果想要使用Extension類加載器加載這個(gè)類,將會(huì)拋出java.lang.ClassNotFoundException異 常。123456789101112131415161718192021222324252627

8、2829package test;     import java.util.logging.Level;    import java.util.logging.Logger;     /*     * Java program to demonstrate How ClassLoader works in Java,     * in particula

9、r about visibility principle of ClassLoader.     *     * author Javin Paul     */     public class ClassLoaderTest          public static void main(String

10、args)             try                           /printing ClassLoader of this class     &#

11、160;          System.out.println("ClassLoaderTest.getClass().getClassLoader() : "                          

12、60;          + ClassLoaderTest.class.getClassLoader();                 /trying to explicitly load this class again using Extension class loader   

13、0;            Class.forName("test.ClassLoaderTest", true                             

14、   ,  ClassLoaderTest.class.getClassLoader().getParent();             catch (ClassNotFoundException ex)                 Logger.getLogger(Cla

15、ssLoaderTest.class.getName().log(Level.SEVERE, null, ex);                         輸出:12345678910111213ClassLoaderTest.getClass().getClassLoader() : sun.misc.Launcher$AppClassL

16、oader601bb116/08/2012 2:43:48 AM test.ClassLoaderTest mainSEVERE: nulljava.lang.ClassNotFoundException: test.ClassLoaderTest        at .URLClassLoader$1.run(URLClassLoader.java:202)        at java.security.AccessControll

17、er.doPrivileged(Native Method)        at .URLClassLoader.findClass(URLClassLoader.java:190)        at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)        at java.l

18、ang.ClassLoader.loadClass(ClassLoader.java:306)        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)        at java.lang.Class.forName0(Native Method)        at java.lan

19、g.Class.forName(Class.java:247)        at test.ClassLoaderTest.main(ClassLoaderTest.java:29)單一性機(jī)制根據(jù)這個(gè)機(jī)制,父加載器加載過的類不能被子加載器加載第二次。雖然重寫違反委托和單一性機(jī)制的類加載器是可能的,但這樣做并不可取。你寫自己的類加載器的時(shí)候應(yīng)該嚴(yán)格遵守這三條機(jī)制。如何顯式的加載類Java提供了顯式加載類的API:Class.forName(classname)和Class.forName(classname, initialized, classloader)。就像上面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論