- 相關(guān)推薦
java類(lèi)加載器的樹(shù)狀組織結(jié)構(gòu)
Java 中的類(lèi)加載器大致可以分成兩類(lèi),一類(lèi)是系統(tǒng)提供的,另外一類(lèi)則是由 Java 應(yīng)用開(kāi)發(fā)人員編寫(xiě)的。那么java類(lèi)加載器有哪些,下面yjbys小編為大家一一解讀!
系統(tǒng)提供的類(lèi)加載器主要有下面三個(gè):
引導(dǎo)類(lèi)加載器(bootstrap class loader):它用來(lái)加載 Java 的核心庫(kù),是用原生代碼來(lái)實(shí)現(xiàn)的,并不繼承自 java.lang.ClassLoader。擴(kuò)展類(lèi)加載器(extensions class loader):它用來(lái)加載 Java 的擴(kuò)展庫(kù)。Java 虛擬機(jī)的實(shí)現(xiàn)會(huì)提供一個(gè)擴(kuò)展庫(kù)目錄。該類(lèi)加載器在此目錄里面查找并加載 Java 類(lèi)。系統(tǒng)類(lèi)加載器(system class loader):它根據(jù) Java 應(yīng)用的類(lèi)路徑(CLASSPATH)來(lái)加載 Java 類(lèi)。一般來(lái)說(shuō),Java 應(yīng)用的類(lèi)都是由它來(lái)完成加載的。可以通過(guò) ClassLoader.getSystemClassLoader()來(lái)獲取它。除了系統(tǒng)提供的類(lèi)加載器以外,開(kāi)發(fā)人員可以通過(guò)繼承 java.lang.ClassLoader類(lèi)的方式實(shí)現(xiàn)自己的類(lèi)加載器,以滿足一些特殊的需求。
除了引導(dǎo)類(lèi)加載器之外,所有的類(lèi)加載器都有一個(gè)父類(lèi)加載器。通過(guò) 表 1中給出的 getParent()方法可以得到。對(duì)于系統(tǒng)提供的類(lèi)加載器來(lái)說(shuō),系統(tǒng)類(lèi)加載器的父類(lèi)加載器是擴(kuò)展類(lèi)加載器,而擴(kuò)展類(lèi)加載器的父類(lèi)加載器是引導(dǎo)類(lèi)加載器;對(duì)于開(kāi)發(fā)人員編寫(xiě)的類(lèi)加載器來(lái)說(shuō),其父類(lèi)加載器是加載此類(lèi)加載器 Java 類(lèi)的類(lèi)加載器。因?yàn)轭?lèi)加載器 Java 類(lèi)如同其它的 Java 類(lèi)一樣,也是要由類(lèi)加載器來(lái)加載的。一般來(lái)說(shuō),開(kāi)發(fā)人員編寫(xiě)的類(lèi)加載器的父類(lèi)加載器是系統(tǒng)類(lèi)加載器。類(lèi)加載器通過(guò)這種方式組織起來(lái),形成樹(shù)狀結(jié)構(gòu)。樹(shù)的根節(jié)點(diǎn)就是引導(dǎo)類(lèi)加載器。圖 1中給出了一個(gè)典型的類(lèi)加載器樹(shù)狀組織結(jié)構(gòu)示意圖,其中的箭頭指向的是父類(lèi)加載器。
圖 1. 類(lèi)加載器樹(shù)狀組織結(jié)構(gòu)示意圖
代碼清單 1演示了類(lèi)加載器的樹(shù)狀組織結(jié)構(gòu)。
清單 1. 演示類(lèi)加載器的樹(shù)狀組織結(jié)構(gòu)
public class ClassLoaderTree {
public static void main(String[] args) {
ClassLoader loader = ClassLoaderTree. class .getClassLoader();
while (loader != null ) {
System.out.println(loader.toString());
loader = loader.getParent();
}
}
} |
每個(gè) Java 類(lèi)都維護(hù)著一個(gè)指向定義它的類(lèi)加載器的引用,通過(guò) getClassLoader()方法就可以獲取到此引用。代碼清單 1中通過(guò)遞歸調(diào)用getParent()方法來(lái)輸出全部的父類(lèi)加載器。代碼清單 1的運(yùn)行結(jié)果如 代碼清單 2所示。
清單 2. 演示類(lèi)加載器的樹(shù)狀組織結(jié)構(gòu)的運(yùn)行結(jié)果
sun.misc.Launcher$AppClassLoader @9304b1
sun.misc.Launcher$ExtClassLoader @190d11
|
如 代碼清單 2所示,第一個(gè)輸出的是 ClassLoaderTree類(lèi)的類(lèi)加載器,即系統(tǒng)類(lèi)加載器。它是 sun.misc.Launcher$AppClassLoader類(lèi)的實(shí)例;第二個(gè)輸出的是擴(kuò)展類(lèi)加載器,是 sun.misc.Launcher$ExtClassLoader類(lèi)的實(shí)例。需要注意的是這里并沒(méi)有輸出引導(dǎo)類(lèi)加載器,這是由于有些 JDK 的實(shí)現(xiàn)對(duì)于父類(lèi)加載器是引導(dǎo)類(lèi)加載器的情況,getParent()方法返回 null。
【java類(lèi)加載器的樹(shù)狀組織結(jié)構(gòu)】相關(guān)文章:
企業(yè)項(xiàng)目管理組織結(jié)構(gòu)09-02
Java時(shí)間類(lèi)及函數(shù)用法07-26
java實(shí)現(xiàn)web服務(wù)器的方法10-14
Java編寫(xiě)計(jì)算器的的常見(jiàn)做法08-12
Java Web服務(wù)器(應(yīng)用服務(wù)器)10-03
java語(yǔ)句及其控制結(jié)構(gòu)題庫(kù)及答案06-24
組織結(jié)構(gòu)與企業(yè)戰(zhàn)略的匹配06-04