下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股權(quán)質(zhì)押資產(chǎn)重組合同示范文本3篇
- 二零二五年度鋼材倉儲(chǔ)物流服務(wù)合同9篇
- 二零二五年度路燈照明設(shè)施安全檢測合同樣本2篇
- 二零二五年度:勞動(dòng)合同法實(shí)務(wù)操作與案例分析合同3篇
- 二零二五年度船舶建造與設(shè)備安裝合同2篇
- 二零二五年度農(nóng)產(chǎn)品質(zhì)量檢測合同范本3篇
- 二零二五年度安置房買賣合同電子支付與結(jié)算規(guī)范3篇
- 3、2025年度綠色出行接送機(jī)服務(wù)合同范本2篇
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)合作開發(fā)合同范本3篇
- 家里陪護(hù)合同(2篇)
- 手術(shù)室護(hù)理實(shí)踐指南2023年
- 電力安全工作規(guī)程(變電部分)課件
- 新人教版六年級(jí)下冊數(shù)學(xué)全冊課件
- 環(huán)保設(shè)施安全風(fēng)險(xiǎn)告知卡
- 卵石地層樁基旋挖鉆施工方案
- 江蘇對(duì)口單招英語考綱詞匯總結(jié)
- (完整word版)手卡模板
- GB/T 4091-2001常規(guī)控制圖
- GB/T 13912-2020金屬覆蓋層鋼鐵制件熱浸鍍鋅層技術(shù)要求及試驗(yàn)方法
- GB 18399-2001棉花加工機(jī)械安全要求
- 陜西省延安市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
評(píng)論
0/150
提交評(píng)論