類(lèi)加載器負(fù)責(zé)讀取Java字節(jié)碼下梢,并轉(zhuǎn)換成java.lang.Class類(lèi)的一個(gè)實(shí)例辨绊。
1. 類(lèi)加載器的分類(lèi)
站在虛擬機(jī)的角度奶栖,類(lèi)加載器分為兩類(lèi):一種是啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader),是虛擬機(jī)自身的一部分门坷;另外一種就是獨(dú)立于虛擬機(jī)外部的類(lèi)加載器宣鄙,繼承自抽象類(lèi)java.lang.ClassLoader。
站在Java開(kāi)發(fā)人員的角度默蚌,可細(xì)分為:
啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader):負(fù)責(zé)加載lt;JAVA_HOMEgt;\lib目錄中的冻晤,或者由-Xbootclasspath參數(shù)指定的路徑中的類(lèi)庫(kù)。這些類(lèi)庫(kù)根據(jù)文件名被虛擬機(jī)識(shí)別绸吸,如rt.jar鼻弧,名字不符號(hào)的類(lèi)庫(kù)即使在這些目錄中也不會(huì)被加載。
擴(kuò)展類(lèi)加載器(Extension ClassLoader):負(fù)責(zé)加載lt;JAVA_HOMEgt;\lib\ext目錄中的锦茁,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類(lèi)庫(kù)攘轩。由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)。
應(yīng)用程序類(lèi)加載器(Application ClassLoader):負(fù)責(zé)加載環(huán)境變量Classpath指定路徑中的码俩,或者被java.class.path系統(tǒng)變量所指定的路徑中的所有類(lèi)庫(kù)度帮。由sun.misc.Launcher$AppClassLoader實(shí)現(xiàn)∥章辏可以通過(guò)ClassLoader.getSystemClassLoader()方法的返回值得到够傍。
用戶(hù)自定義類(lèi)加載器:必須繼承java.lang.ClassLoader,下面介紹挠铲。
2. java.lang.ClassLoader類(lèi)介紹
自定義類(lèi)加載器必須繼承自java.lang.ClassLoader冕屯,該類(lèi)的一些重要方法如下所示:
方法 | 說(shuō)明 |
---|---|
getParent() | 返回加載器的父類(lèi)加載器 |
loadClass(String name) | 加載名稱(chēng)為name的類(lèi),返回的結(jié)果是 java.lang.Class類(lèi)的實(shí)例拂苹。 |
findClass(String name) | 查找名稱(chēng)為name的類(lèi)安聘,返回的結(jié)果是 java.lang.Class類(lèi)的實(shí)例。 |
findLoadedClass(String name) | 查找名稱(chēng)為name的已經(jīng)被加載過(guò)的類(lèi)瓢棒,返回的結(jié)果是 java.lang.Class類(lèi)的實(shí)例浴韭。 |
defineClass(String name, byte[] b, int off, int len) | 把字節(jié)數(shù)組b中的內(nèi)容轉(zhuǎn)換成Java 類(lèi),返回的結(jié)果是 java.lang.Class類(lèi)的實(shí)例脯宿。這個(gè)方法被聲明為final的念颈。 |
resolveClass(Class<?> c) | 鏈接指定的Java 類(lèi)。 |
ClassLoader加載類(lèi)的過(guò)程由loadClass()執(zhí)行连霉。按照以下優(yōu)先級(jí)加載類(lèi):
調(diào)用findLoadedClass(String)檢查類(lèi)是否已經(jīng)加載榴芳。
如果父類(lèi)加載器不為空嗡靡,則調(diào)用父類(lèi)加載器的loadClass()方法;否則調(diào)用啟動(dòng)類(lèi)加載器的loadClass()方法窟感。
調(diào)用findClass(String)方法讨彼,該方法找到類(lèi)對(duì)應(yīng)的字節(jié)流后會(huì)調(diào)用defineClass方法。
3. 其他
每一個(gè)java.lang.Class對(duì)象都包含一個(gè)指向定義該類(lèi)的類(lèi)加載器柿祈。
對(duì)于一個(gè)同一個(gè)類(lèi)文件哈误,類(lèi)加載器不同,得到的將不是同一種類(lèi)型躏嚎,即Class對(duì)象的equal將返回false蜜自。
數(shù)組對(duì)象由Java運(yùn)行時(shí)創(chuàng)建,數(shù)組元素為對(duì)象的數(shù)組的類(lèi)加載器與其數(shù)組元素相同卢佣;數(shù)組元素為元素類(lèi)型的數(shù)組的類(lèi)加載器為null袁辈。