貴陽(yáng)網(wǎng)站制作策劃無(wú)錫網(wǎng)站seo
類(lèi)加載
1、ClassLoader 用來(lái)加載 Class 文件
2、 系統(tǒng)內(nèi)置的ClassLoader 通過(guò)雙親委托加載指定目錄下的class和資源
3、 可以自定義ClassLoader 一般覆蓋findClass()
4、ContextClassLoader 與線程相關(guān),可以獲取和設(shè)置,可以繞過(guò)雙親委托的機(jī)制。
三個(gè)類(lèi)加載器
BootStrap ClassLoader:稱(chēng)為啟動(dòng)類(lèi)加載器,是Java類(lèi)加載層次中最頂層的類(lèi)加載器,負(fù)責(zé)加載JDK中的核心類(lèi)庫(kù),如:rt.jar、resources.jar、charsets.jar等
Extension ClassLoader:稱(chēng)為擴(kuò)展類(lèi)加載器,負(fù)責(zé)加載Java的擴(kuò)展類(lèi)庫(kù),默認(rèn)加載JAVA_HOME/jre/lib/ext/目下的所有jar。
App ClassLoader:稱(chēng)為系統(tǒng)類(lèi)加載器,負(fù)責(zé)加載應(yīng)用程序classpath目錄下的所有jar和class文件。
除了Java默認(rèn)提供的三個(gè)ClassLoader之外,用戶(hù)還可以根據(jù)需要定義自已的ClassLoader,而這些自定義的ClassLoader都必須繼承自java.lang.ClassLoader類(lèi),也包括Java提供的另外二個(gè)ClassLoader(Extension ClassLoader和App ClassLoader)在內(nèi),但是Bootstrap ClassLoader不繼承自ClassLoader,因?yàn)樗皇且粋€(gè)普通的Java類(lèi),底層由C++編寫(xiě),已嵌入到了JVM內(nèi)核當(dāng)中,當(dāng)JVM啟動(dòng)后,Bootstrap ClassLoader也隨著啟動(dòng),負(fù)責(zé)加載完核心類(lèi)庫(kù)后,并構(gòu)造Extension ClassLoader和App ClassLoader類(lèi)加載器。
原理
ClassLoader使用的是雙親委托模型來(lái)搜索類(lèi)的,每個(gè)ClassLoader實(shí)例都有一個(gè)父類(lèi)加載器的引用(不是繼承的關(guān)系,是一個(gè)包含的關(guān)系),虛擬機(jī)內(nèi)置的類(lèi)加載器(Bootstrap ClassLoader)本身沒(méi)有父類(lèi)加載器,但可以用作其它ClassLoader實(shí)例的的父類(lèi)加載器。當(dāng)一個(gè)ClassLoader實(shí)例需要加載某個(gè)類(lèi)時(shí),它會(huì)試圖親自搜索某個(gè)類(lèi)之前,先把這個(gè)任務(wù)委托給它的父類(lèi)加載器,這個(gè)過(guò)程是由上至下依次檢查的,首先由最頂層的類(lèi)加載器Bootstrap ClassLoader試圖加載,如果沒(méi)加載到,則把任務(wù)轉(zhuǎn)交給Extension ClassLoader試圖加載,如果也沒(méi)加載到,則轉(zhuǎn)交給App ClassLoader 進(jìn)行加載,如果它也沒(méi)有加載得到的話(huà),則返回給委托的發(fā)起者,由它到指定的文件系統(tǒng)或網(wǎng)絡(luò)等URL中加載該類(lèi)。如果它們都沒(méi)有加載到這個(gè)類(lèi)時(shí),則拋出ClassNotFoundException異常。否則將這個(gè)找到的類(lèi)生成一個(gè)類(lèi)的定義,并將它加載到內(nèi)存當(dāng)中,最后返回這個(gè)類(lèi)在內(nèi)存中的Class實(shí)例對(duì)象。
定義自已的ClassLoader
既然JVM已經(jīng)提供了默認(rèn)的類(lèi)加載器,為什么還要定義自已的類(lèi)加載器呢?
因?yàn)镴ava中提供的默認(rèn)ClassLoader,只加載指定目錄下的jar和class,如果我們想加載其它位置的類(lèi)或jar時(shí),比如:我要加載網(wǎng)絡(luò)上的一個(gè)class文件,通過(guò)動(dòng)態(tài)加載到內(nèi)存之后,要調(diào)用這個(gè)類(lèi)中的方法實(shí)現(xiàn)我的業(yè)務(wù)邏輯。在這樣的情況下,默認(rèn)的ClassLoader就不能滿(mǎn)足我們的需求了,所以需要定義自己的ClassLoader。
定義自已的類(lèi)加載器分為兩步:
1、繼承java.lang.ClassLoader
2、重寫(xiě)父類(lèi)的findClass方法