W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
java.lang.Object
|---java.lang.ClassLoader
public abstract class ClassLoader
extends Object
類加載器是負(fù)責(zé)加載類的對(duì)象。 ClassLoader 類是一個(gè)抽象類。給定類的二進(jìn)制名稱,類加載器應(yīng)該嘗試定位或生成構(gòu)成類定義的數(shù)據(jù)。一種典型的策略是將名稱轉(zhuǎn)換為文件名,然后從文件系統(tǒng)中讀取該名稱的“類文件”。
每個(gè) Class 對(duì)象都包含一個(gè) Class#getClassLoader() 到定義它的 ClassLoader。
數(shù)組類的類對(duì)象不是由類加載器創(chuàng)建的,而是根據(jù) Java 運(yùn)行時(shí)的要求自動(dòng)創(chuàng)建的。 Class#getClassLoader() 返回的數(shù)組類的類加載器與其元素類型的類加載器相同;如果元素類型是原始類型,則數(shù)組類沒(méi)有類加載器。
應(yīng)用程序?qū)崿F(xiàn) ClassLoader 的子類以擴(kuò)展 Java 虛擬機(jī)動(dòng)態(tài)加載類的方式。
安全管理器通??梢允褂妙惣虞d器來(lái)指示安全域。
ClassLoader 類使用委托模型來(lái)搜索類和資源。 ClassLoader 的每個(gè)實(shí)例都有一個(gè)關(guān)聯(lián)的父類加載器。當(dāng)請(qǐng)求查找類或資源時(shí),ClassLoader 實(shí)例將在嘗試查找類或資源本身之前將對(duì)該類或資源的搜索委托給其父類加載器。虛擬機(jī)的內(nèi)置類加載器,稱為“引導(dǎo)類加載器”,它本身沒(méi)有父級(jí),但可以作為 ClassLoader 實(shí)例的父級(jí)。
支持并發(fā)加載類的類加載器被稱為具有并行能力的類加載器,并且需要在類初始化時(shí)通過(guò)調(diào)用 ClassLoader.registerAsParallelCapable 方法來(lái)注冊(cè)自己。請(qǐng)注意,ClassLoader 類默認(rèn)注冊(cè)為具有并行功能。但是,如果它們具有并行能力,它的子類仍然需要注冊(cè)自己。在委托模型不是嚴(yán)格分層的環(huán)境中,類加載器需要具有并行能力,否則類加載會(huì)導(dǎo)致死鎖,因?yàn)榧虞d器鎖在類加載過(guò)程中被持有(參見(jiàn) loadClass 方法)。
通常,Java 虛擬機(jī)以平臺(tái)相關(guān)的方式從本地文件系統(tǒng)加載類。例如,在 UNIX 系統(tǒng)上,虛擬機(jī)從 CLASSPATH 環(huán)境變量定義的目錄中加載類。
但是,某些類可能不是源自文件;它們可能來(lái)自其他來(lái)源,例如網(wǎng)絡(luò),或者它們可以由應(yīng)用程序構(gòu)建。 defineClass 方法將字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例。這個(gè)新定義的類的實(shí)例可以使用 Class#newInstance 創(chuàng)建。
類加載器創(chuàng)建的對(duì)象的方法和構(gòu)造函數(shù)可以引用其他類。為了確定引用的類,Java 虛擬機(jī)調(diào)用最初創(chuàng)建該類的類加載器的 loadClass 方法。
例如,應(yīng)用程序可以創(chuàng)建一個(gè)網(wǎng)絡(luò)類加載器來(lái)從服務(wù)器下載類文件。示例代碼可能如下所示:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
網(wǎng)絡(luò)類加載器子類必須定義方法 findClass 和 loadClassData 以從網(wǎng)絡(luò)加載類。 一旦它下載了組成類的字節(jié),它應(yīng)該使用方法defineClass來(lái)創(chuàng)建一個(gè)類實(shí)例。 一個(gè)示例實(shí)現(xiàn)是:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
二進(jìn)制名稱
任何作為 String 參數(shù)提供給 ClassLoader 中的方法的類名都必須是《Java? 語(yǔ)言規(guī)范》定義的二進(jìn)制名稱。
有效類名的示例包括:
"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"
修飾符 | 構(gòu)造函數(shù) | 描述 |
---|---|---|
protected | ClassLoader() | 使用 getSystemClassLoader() 方法返回的 ClassLoader 作為父類加載器創(chuàng)建一個(gè)新的類加載器。 |
protected | ClassLoader(ClassLoader parent) | 使用指定的父類加載器為委托創(chuàng)建一個(gè)新的類加載器。 |
修飾符和類型 | 方法 | 描述 |
---|---|---|
void | clearAssertionStatus() | 將此類加載器的默認(rèn)斷言狀態(tài)設(shè)置為 false 并丟棄與類加載器關(guān)聯(lián)的任何包默認(rèn)值或類斷言狀態(tài)設(shè)置。 |
protected Class<?> | defineClass(byte[] b, int off, int len) | 已棄用。 替換為 [defineClass(String, byte], int, int) |
protected Class<?> | defineClass(String name, byte[] b, int off, int len) | 將字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例。 |
protected Class<?> | defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) | 使用可選的 ProtectionDomain 將字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例。 |
protected Class<?> | defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) | 使用可選的 ProtectionDomain 將 ByteBuffer 轉(zhuǎn)換為 Class 類的實(shí)例。 |
protected Package | definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) | 在此 ClassLoader 中按名稱定義包。 |
protected Class<?> | findClass(String name) | 查找具有指定二進(jìn)制名稱的類。 |
protected String | findLibrary(String libname) | 返回本機(jī)庫(kù)的絕對(duì)路徑名。 |
protected Class<?> | findLoadedClass(String name) | 如果 Java 虛擬機(jī)將此加載器記錄為具有該二進(jìn)制名稱的類的初始加載器,則返回具有給定二進(jìn)制名稱的類。 |
protected URL | findResource(String name) | 查找具有給定名稱的資源。 |
protected EnumerationURL | findResources(String name) | 返回代表具有給定名稱的所有資源的 URL 對(duì)象的枚舉。 |
protected Class<?> | findSystemClass(String name) | 查找具有指定二進(jìn)制名稱的類,并在必要時(shí)加載它。 |
protected Package | getPackage(String name) | 返回已由此類加載器或其任何祖先定義的包。 |
protected Package[] | getPackages() | 返回此類加載器及其祖先定義的所有包。 |
ClassLoader | getParent() | 返回委托的父類加載器。 |
URL | getResource(String name) | 查找具有給定名稱的資源。 |
InputStream | getResourceAsStream(String name) | 返回用于讀取指定資源的輸入流。 |
EnumerationURL | getResources(String name) | 查找具有給定名稱的所有資源。 |
static ClassLoader | getSystemClassLoader() | 返回委托的系統(tǒng)類加載器。 |
static URL | getSystemResource(String name) | 從用于加載類的搜索路徑中查找指定名稱的資源。 |
static InputStream | getSystemResourceAsStream(String name) | 打開(kāi)讀取,從用于加載類的搜索路徑中指定名稱的資源。 |
static EnumerationURL | getSystemResources(String name) | 從用于加載類的搜索路徑中查找指定名稱的所有資源。 |
Class<?> | loadClass(String name) | 加載具有指定二進(jìn)制名稱的類。 |
protected Class<?> | loadClass(String name, boolean resolve) | 加載具有指定二進(jìn)制名稱的類。 |
protected static boolean | registerAsParallelCapable() | 將調(diào)用者注冊(cè)為具有并行能力。 |
protected void | resolveClass(Class<?> c) | 鏈接指定的類。 |
void | setClassAssertionStatus(String className, boolean enabled) | 為此類加載器中的命名頂級(jí)類和其中包含的任何嵌套類設(shè)置所需的斷言狀態(tài)。 |
void | setDefaultAssertionStatus(boolean enabled) | 設(shè)置此類加載器的默認(rèn)斷言狀態(tài)。 |
void | setPackageAssertionStatus(String packageName, boolean enabled) | 設(shè)置命名包的包默認(rèn)斷言狀態(tài)。 |
protected void | setSigners(Class<?> c, Object[] signers) | 設(shè)置類的簽名者。 |
從類 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
protected ClassLoader(ClassLoader parent)
使用指定的父類加載器為委托創(chuàng)建一個(gè)新的類加載器。
如果存在安全管理器,則調(diào)用其 SecurityManager#checkCreateClassLoader() 方法。 這可能會(huì)導(dǎo)致安全異常。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
parent | 父類加載器 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允許創(chuàng)建新的類加載器。 |
protected ClassLoader()
使用 getSystemClassLoader() 方法返回的 ClassLoader 作為父類加載器創(chuàng)建一個(gè)新的類加載器。
如果存在安全管理器,則調(diào)用其 SecurityManager#checkCreateClassLoader() 方法。 這可能會(huì)導(dǎo)致安全異常。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允許創(chuàng)建新的類加載器。 |
public Class<?> loadClass(String name) throws ClassNotFoundException
加載具有指定二進(jìn)制名稱的類。 此方法以與 loadClass(java.lang.String,boolean) 方法相同的方式搜索類。 Java 虛擬機(jī)調(diào)用它來(lái)解析類引用。 調(diào)用此方法等效于調(diào)用 loadClass(name, false)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的二進(jìn)制名稱 |
返回:
生成的 Class 對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到類 |
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
加載具有指定二進(jìn)制名稱的類。 此方法的默認(rèn)實(shí)現(xiàn)按以下順序搜索類:
如果使用上述步驟找到了類,并且解析標(biāo)志為真,則此方法將在生成的 Class 對(duì)象上調(diào)用 resolveClass(java.lang.Class) 方法。
鼓勵(lì) ClassLoader 的子類覆蓋 findClass(java.lang.String),而不是這個(gè)方法。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的二進(jìn)制名稱 |
resolve | 如果為真,則解析該類 |
返回:
生成的 Class 對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到類 |
protected Class<?> findClass(String name) throws ClassNotFoundException
查找具有指定二進(jìn)制名稱的類。 這個(gè)方法應(yīng)該被遵循委托模型加載類的類加載器實(shí)現(xiàn)覆蓋,并且在檢查請(qǐng)求的類的父類加載器后由 loadClass 方法調(diào)用。 默認(rèn)實(shí)現(xiàn)會(huì)引發(fā) ClassNotFoundException。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的二進(jìn)制名稱 |
返回:
生成的 Class 對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到類 |
@Deprecated protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
已棄用。 替換為 [defineClass(String, byte], int, int)
將字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例。 在使用該類之前,必須先解決它。 此方法已棄用,取而代之的是采用二進(jìn)制名稱作為其第一個(gè)參數(shù)的版本,并且更安全。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
b | 構(gòu)成類數(shù)據(jù)的字節(jié)。 off 到 off+len-1 位置的字節(jié)應(yīng)具有《Java? 虛擬機(jī)規(guī)范》定義的有效類文件的格式。 |
off | 類數(shù)據(jù)在 b 中的起始偏移量 |
len | 類數(shù)據(jù)的長(zhǎng)度 |
返回:
從指定的類數(shù)據(jù)創(chuàng)建的 Class 對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassFormatError | 如果數(shù)據(jù)不包含有效的類 |
IndexOutOfBoundsException | 如果 off 或 len 為負(fù)數(shù),或者 off+len 大于 b.length。 |
SecurityException | 如果嘗試將此類添加到包含由與此類不同的證書集簽名的類的包中,或者嘗試在包中定義具有以開(kāi)頭的完全限定名稱的類 “java”。 |
protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError
將字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例。 在使用該類之前,必須先解決它。
此方法將默認(rèn) ProtectionDomain 分配給新定義的類。 當(dāng)調(diào)用 Policy.getPolicy().getPermissions(new CodeSource(null, null)) 時(shí),ProtectionDomain 被有效地授予了相同的權(quán)限集。 默認(rèn)域在第一次調(diào)用 defineClass 時(shí)創(chuàng)建,并在后續(xù)調(diào)用中重用。
要將特定的 ProtectionDomain 分配給類,請(qǐng)使用將 ProtectionDomain 作為其參數(shù)之一的 defineClass 方法。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的預(yù)期二進(jìn)制名稱,如果未知,則為 null |
b | 構(gòu)成類數(shù)據(jù)的字節(jié)。 off 到 off+len-1 位置的字節(jié)應(yīng)具有《Java? 虛擬機(jī)規(guī)范》定義的有效類文件的格式。 |
off | 類數(shù)據(jù)在 b 中的起始偏移量 |
len | 類數(shù)據(jù)的長(zhǎng)度 |
返回:
從指定的類數(shù)據(jù)創(chuàng)建的 Class 對(duì)象。
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassFormatError | 如果數(shù)據(jù)不包含有效的類 |
IndexOutOfBoundsException | 如果 off 或 len 為負(fù)數(shù),或者 off+len 大于 b.length。 |
SecurityException | 如果嘗試將此類添加到包含由與此類不同的證書集(未簽名)簽名的類的包中,或者名稱以“java.”開(kāi)頭。 |
protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError
使用可選的 ProtectionDomain 將字節(jié)數(shù)組轉(zhuǎn)換為 Class 類的實(shí)例。如果域?yàn)榭眨瑒t將按照 [defineClass(java.lang.String,byte],int,int) 的文檔中的規(guī)定為類分配一個(gè)默認(rèn)域。在使用該類之前,必須先解決它。
包中定義的第一個(gè)類確定了該包中定義的所有后續(xù)類必須包含的確切證書集。類的證書集是從類的 ProtectionDomain 中的 CodeSource 獲得的。添加到該包的任何類都必須包含相同的證書集,否則將引發(fā) SecurityException。請(qǐng)注意,如果 name 為 null,則不執(zhí)行此檢查。您應(yīng)該始終傳入您定義的類的二進(jìn)制名稱以及字節(jié)。這可以確保您定義的類確實(shí)是您認(rèn)為的類。
指定的名稱不能以“java.”開(kāi)頭,因?yàn)椤癹ava.*”包中的所有類只能由引導(dǎo)類加載器定義。如果名稱不為空,則它必須等于指定的類的二進(jìn)制名稱字節(jié)數(shù)組“b”,否則會(huì)拋出 NoClassDefFoundError。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的預(yù)期二進(jìn)制名稱,如果未知,則為 null |
b | 構(gòu)成類數(shù)據(jù)的字節(jié)。 off 到 off+len-1 位置的字節(jié)應(yīng)具有《Java? 虛擬機(jī)規(guī)范》定義的有效類文件的格式。 |
off | 類數(shù)據(jù)在 b 中的起始偏移量 |
len | 類數(shù)據(jù)的長(zhǎng)度 |
protectionDomain | 類的保護(hù)域 |
返回:
從數(shù)據(jù)創(chuàng)建的 Class 對(duì)象,以及可選的 ProtectionDomain。
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassFormatError | 如果數(shù)據(jù)不包含有效的類 |
NoClassDefFoundError | 如果 name 不等于 b 指定的類的二進(jìn)制名稱 |
IndexOutOfBoundsException | 如果 off 或 len 為負(fù)數(shù),或者 off+len 大于 b.length。 |
SecurityException | 如果嘗試將此類添加到包含由與此類不同的證書集簽名的類的包中,或者名稱以“java.”開(kāi)頭。 |
protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
使用可選的 ProtectionDomain 將 ByteBuffer 轉(zhuǎn)換為 Class 類的實(shí)例。 如果域?yàn)榭眨瑒t將按照 [defineClass(java.lang.String,byte],int,int) 的文檔中的規(guī)定為類分配一個(gè)默認(rèn)域。 在使用該類之前,必須先解決它。
關(guān)于包中定義的第一個(gè)類的規(guī)則確定包的證書集,以及對(duì)類名的限制與 [defineClass(java.lang.String,byte],int,int, java.security.ProtectionDomain)。
調(diào)用 cl.defineClass(name, bBuffer, pd) 形式的此方法會(huì)產(chǎn)生與語(yǔ)句完全相同的結(jié)果
... byte[] temp = new byte[bBuffer.remaining()]; bBuffer.get(temp); return cl.defineClass(name, temp, 0, temp.length, pd);
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 預(yù)期的二進(jìn)制名稱。 如果不知道,則為 null |
b | 構(gòu)成類數(shù)據(jù)的字節(jié)。 從位置 b.position() 到 b.position() + b.limit() -1 的字節(jié)應(yīng)具有《Java? 虛擬機(jī)規(guī)范》定義的有效類文件的格式。 |
protectionDomain | 類的 ProtectionDomain 或 null。 |
返回:
從數(shù)據(jù)創(chuàng)建的 Class 對(duì)象,以及可選的 ProtectionDomain。
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassFormatError | 如果數(shù)據(jù)不包含有效的類。 |
NoClassDefFoundError | 如果 name 不等于 b 指定的類的二進(jìn)制名稱 |
SecurityException | 如果嘗試將此類添加到包含由與此類不同的證書集簽名的類的包中,或者名稱以“java.”開(kāi)頭。 |
protected final void resolveClass(Class<?> c)
鏈接指定的類。 類加載器可以使用這個(gè)(誤導(dǎo)性的)方法來(lái)鏈接一個(gè)類。 如果類 c 已經(jīng)被鏈接,那么這個(gè)方法簡(jiǎn)單地返回。 否則,該類將按照《Java? 語(yǔ)言規(guī)范》的“執(zhí)行”一章中的說(shuō)明進(jìn)行鏈接。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
c | 要鏈接的類 |
Throws:
Throw名稱 | Throw描述 |
---|---|
NullPointerException | 如果 c 為空。 |
protected final Class<?> findSystemClass(String name) throws ClassNotFoundException
查找具有指定二進(jìn)制名稱的類,并在必要時(shí)加載它。
此方法通過(guò)系統(tǒng)類加載器加載類(參見(jiàn) getSystemClassLoader())。 返回的 Class 對(duì)象可能有多個(gè)與之關(guān)聯(lián)的 ClassLoader。 ClassLoader 的子類通常不需要調(diào)用此方法,因?yàn)榇蠖鄶?shù)類加載器只需要覆蓋 findClass(java.lang.String)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的二進(jìn)制名稱 |
返回:
指定名稱的 Class 對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到類 |
protected final Class<?> findLoadedClass(String name)
如果 Java 虛擬機(jī)將此加載器記錄為具有該二進(jìn)制名稱的類的初始加載器,則返回具有給定二進(jìn)制名稱的類。 否則返回 null。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的二進(jìn)制名稱 |
返回:
Class 對(duì)象,如果尚未加載該類,則為 null
protected final void setSigners(Class<?> c, Object[] signers)
設(shè)置類的簽名者。 這應(yīng)該在定義一個(gè)類之后調(diào)用。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
c | 類對(duì)象 |
signers | 類的簽名者 |
public URL getResource(String name)
查找具有給定名稱的資源。 資源是可以由類代碼以獨(dú)立于代碼位置的方式訪問(wèn)的一些數(shù)據(jù)(圖像、音頻、文本等)。
資源的名稱是一個(gè)以“/”分隔的路徑名,用于標(biāo)識(shí)該資源。
該方法將首先在父類加載器中搜索資源; 如果 parent 為 null,則搜索虛擬機(jī)內(nèi)置的類加載器的路徑。 如果失敗,此方法將調(diào)用 findResource(java.lang.String) 來(lái)查找資源。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
用于讀取資源的 URL 對(duì)象,如果找不到資源或調(diào)用者沒(méi)有足夠的權(quán)限來(lái)獲取資源,則返回 null。
public EnumerationURL getResources(String name) throws IOException
查找具有給定名稱的所有資源。 資源是可以由類代碼以獨(dú)立于代碼位置的方式訪問(wèn)的一些數(shù)據(jù)(圖像、音頻、文本等)。
資源的名稱是標(biāo)識(shí)資源的 / 分隔的路徑名。
getResource(java.lang.String) 的文檔中描述了搜索順序。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
資源的 URL 對(duì)象的枚舉。 如果找不到資源,則枚舉將為空。 類加載器無(wú)權(quán)訪問(wèn)的資源不會(huì)出現(xiàn)在枚舉中。
Throws:
Throw名稱 | Throw描述 |
---|---|
IOException | 如果發(fā)生 I/O 錯(cuò)誤 |
protected URL findResource(String name)
查找具有給定名稱的資源。 類加載器實(shí)現(xiàn)應(yīng)覆蓋此方法以指定在何處查找資源。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
用于讀取資源的 URL 對(duì)象,如果找不到資源,則返回 null
protected EnumerationURL findResources(String name) throws IOException
返回代表具有給定名稱的所有資源的 URL 對(duì)象的枚舉。 類加載器實(shí)現(xiàn)應(yīng)覆蓋此方法以指定從何處加載資源。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
資源的 URL 對(duì)象的枚舉
Throws:
Throw名稱 | Throw描述 |
---|---|
IOException | 如果發(fā)生 I/O 錯(cuò)誤 |
protected static boolean registerAsParallelCapable()
將調(diào)用者注冊(cè)為具有并行能力。 當(dāng)且僅當(dāng)滿足以下所有條件時(shí),注冊(cè)成功:
請(qǐng)注意,一旦類加載器注冊(cè)為具有并行能力,就無(wú)法將其更改回來(lái)。
返回:
如果調(diào)用者成功注冊(cè)為具有并行能力,則為 true,否則為 false。
public static URL getSystemResource(String name)
從用于加載類的搜索路徑中查找指定名稱的資源。 此方法通過(guò)系統(tǒng)類加載器定位資源(請(qǐng)參閱 getSystemClassLoader())。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
用于讀取資源的 URL 對(duì)象,如果找不到資源,則返回 null
public static EnumerationURL getSystemResources(String name) throws IOException
從用于加載類的搜索路徑中查找指定名稱的所有資源。 這樣找到的資源作為 URL 對(duì)象的枚舉返回。
getSystemResource(java.lang.String) 的文檔中描述了搜索順序。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
資源 URL 對(duì)象的枚舉
Throws:
Throw名稱 | Throw描述 |
---|---|
IOException | 如果發(fā)生 I/O 錯(cuò)誤 |
public InputStream getResourceAsStream(String name)
返回用于讀取指定資源的輸入流。
getResource(java.lang.String) 的文檔中描述了搜索順序。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
用于讀取資源的輸入流,如果找不到資源,則返回 null
public static InputStream getSystemResourceAsStream(String name)
打開(kāi)讀取,從用于加載類的搜索路徑中指定名稱的資源。 此方法通過(guò)系統(tǒng)類加載器定位資源(請(qǐng)參閱 getSystemClassLoader())。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 資源名稱 |
返回:
用于讀取資源的輸入流,如果找不到資源,則返回 null
public final ClassLoader getParent()
返回委托的父類加載器。 一些實(shí)現(xiàn)可能使用 null 來(lái)表示引導(dǎo)類加載器。 如果此類加載器的父級(jí)是引導(dǎo)類加載器,則此方法將在此類實(shí)現(xiàn)中返回 null。
如果存在安全管理器,并且調(diào)用者的類加載器不為 null 并且不是此類加載器的祖先,則此方法使用 RuntimePermission#RuntimePermission(String) 調(diào)用安全管理器的 SecurityManager#checkPermission(java.security.Permission) 方法 ) 允許驗(yàn)證對(duì)父類加載器的訪問(wèn)權(quán)限。 如果沒(méi)有,將拋出 SecurityException。
返回:
父類加載器
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允許訪問(wèn)此類加載器的父類加載器。 |
public static ClassLoader getSystemClassLoader()
返回委托的系統(tǒng)類加載器。這是新 ClassLoader 實(shí)例的默認(rèn)委托父級(jí),通常是用于啟動(dòng)應(yīng)用程序的類加載器。
此方法首先在運(yùn)行時(shí)啟動(dòng)序列的早期調(diào)用,此時(shí)它創(chuàng)建系統(tǒng)類加載器并將其設(shè)置為調(diào)用線程的上下文類加載器。
默認(rèn)系統(tǒng)類加載器是此類的依賴于實(shí)現(xiàn)的實(shí)例。
如果在第一次調(diào)用此方法時(shí)定義了系統(tǒng)屬性“java.system.class.loader”,則該屬性的值將被視為將作為系統(tǒng)類加載器返回的類的名稱。該類使用默認(rèn)的系統(tǒng)類加載器加載,并且必須定義一個(gè)公共構(gòu)造函數(shù),該構(gòu)造函數(shù)接受一個(gè) ClassLoader 類型的參數(shù),該參數(shù)用作委托父級(jí)。然后使用此構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例,并將默認(rèn)系統(tǒng)類加載器作為參數(shù)。生成的類加載器被定義為系統(tǒng)類加載器。
如果存在安全管理器,并且調(diào)用者的類加載器不為空,并且調(diào)用者的類加載器與系統(tǒng)類加載器的祖先不同,則此方法調(diào)用安全管理器的 SecurityManager#checkPermission(java.security.Permission ) 方法具有 RuntimePermission#RuntimePermission(String) 權(quán)限來(lái)驗(yàn)證對(duì)系統(tǒng)類加載器的訪問(wèn)。如果沒(méi)有,將拋出 SecurityException。
返回:
用于委托的系統(tǒng) ClassLoader,如果沒(méi)有則為 null
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允許訪問(wèn)系統(tǒng)類加載器。 |
IllegalStateException | 如果在構(gòu)造由“java.system.class.loader”屬性指定的類加載器期間遞歸調(diào)用。 |
Error | 如果定義了系統(tǒng)屬性“java.system.class.loader”但無(wú)法加載命名類,則提供程序類未定義所需的構(gòu)造函數(shù),或者該構(gòu)造函數(shù)在調(diào)用時(shí)拋出異常。 可以通過(guò) Throwable#getCause() 方法檢索錯(cuò)誤的根本原因。 |
protected Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) throws IllegalArgumentException
在此 ClassLoader 中按名稱定義包。 這允許類加載器為其類定義包。 必須在定義類之前創(chuàng)建包,并且包名稱在類加載器中必須是唯一的,并且一旦創(chuàng)建就不能重新定義或更改。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 包名 |
specTitle | 規(guī)范標(biāo)題 |
specVersion | 規(guī)范版本 |
specVendor | 規(guī)范廠商 |
implTitle | 實(shí)施標(biāo)題 |
implVersion | 實(shí)施版本 |
implVendor | 實(shí)施廠商 |
sealBase | 如果不為 null,則此包相對(duì)于給定的代碼源 URL 對(duì)象是密封的。 否則,包裝不密封。 |
返回:
新定義的 Package 對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
IllegalArgumentException | 如果包名稱與此類加載器或其祖先之一中的現(xiàn)有包重復(fù) |
protected Package getPackage(String name)
返回已由此類加載器或其任何祖先定義的包。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 包名 |
返回:
與給定名稱對(duì)應(yīng)的包,如果未找到,則返回 null
protected Package[] getPackages()
返回此類加載器及其祖先定義的所有包。
返回:
此 ClassLoader 定義的 Package 對(duì)象數(shù)組
protected String findLibrary(String libname)
返回本機(jī)庫(kù)的絕對(duì)路徑名。 VM 調(diào)用此方法來(lái)定位屬于使用此類加載器加載的類的本機(jī)庫(kù)。 如果此方法返回 null,VM 將沿著指定為“java.library.path”屬性的路徑搜索庫(kù)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
libname | 圖書館名稱 |
返回:
本機(jī)庫(kù)的絕對(duì)路徑
public void setDefaultAssertionStatus(boolean enabled)
設(shè)置此類加載器的默認(rèn)斷言狀態(tài)。 此設(shè)置確定由此類加載器加載并在將來(lái)初始化的類是否默認(rèn)啟用或禁用斷言。 通過(guò)調(diào)用 setPackageAssertionStatus(java.lang.String,boolean) 或 setClassAssertionStatus(java.lang.String,boolean),可以在每個(gè)包或每個(gè)類的基礎(chǔ)上覆蓋此設(shè)置。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
enabled | 如果此類加載器加載的類今后將默認(rèn)啟用斷言,則為 true;如果默認(rèn)情況下禁用斷言,則為 false。 |
public void setPackageAssertionStatus(String packageName, boolean enabled)
設(shè)置命名包的包默認(rèn)斷言狀態(tài)。 包默認(rèn)斷言狀態(tài)決定了將來(lái)初始化的屬于指定包或其任何“子包”的類的斷言狀態(tài)。
名為 p 的包的子包是名稱以“p.”開(kāi)頭的任何包。 例如 javax.swing.text 是 javax.swing 的子包,java.util 和 java.lang.reflect 都是 java 的子包。
如果多個(gè)包默認(rèn)值適用于給定類,則屬于最特定包的包默認(rèn)值優(yōu)先于其他包。 例如,如果 javax.lang 和 javax.lang.reflect 都有與之關(guān)聯(lián)的包默認(rèn)值,則后一個(gè)包默認(rèn)值適用于 javax.lang.reflect 中的類。
包默認(rèn)值優(yōu)先于類加載器的默認(rèn)斷言狀態(tài),并且可以通過(guò)調(diào)用 setClassAssertionStatus(java.lang.String,boolean) 在每個(gè)類的基礎(chǔ)上覆蓋。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
packageName | 要設(shè)置其包默認(rèn)斷言狀態(tài)的包的名稱。 空值表示“當(dāng)前”的未命名包(請(qǐng)參閱《Java? 語(yǔ)言規(guī)范》的第 7.4.2 節(jié)。) |
enabled | 如果此類加載器加載的屬于命名包或其任何子包的類默認(rèn)啟用斷言,則返回 true;如果默認(rèn)禁用斷言,則返回 false。 |
public void setClassAssertionStatus(String className, boolean enabled)
為此類加載器中的命名頂級(jí)類和其中包含的任何嵌套類設(shè)置所需的斷言狀態(tài)。 此設(shè)置優(yōu)先于類加載器的默認(rèn)斷言狀態(tài),以及任何適用的每個(gè)包的默認(rèn)值。 如果命名類已經(jīng)初始化,則此方法無(wú)效。 (一旦一個(gè)類被初始化,它的斷言狀態(tài)就不能改變。)
如果命名類不是頂級(jí)類,則此調(diào)用不會(huì)影響任何類的實(shí)際斷言狀態(tài)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
className | 要設(shè)置其斷言狀態(tài)的頂級(jí)類的完全限定類名。 |
enabled | 如果命名類在初始化時(shí)(如果)要啟用斷言,則為 true,如果要禁用該類的斷言,則為 false。 |
public void clearAssertionStatus()
將此類加載器的默認(rèn)斷言狀態(tài)設(shè)置為 false 并丟棄與類加載器關(guān)聯(lián)的任何包默認(rèn)值或類斷言狀態(tài)設(shè)置。 提供此方法是為了使類加載器可以忽略任何命令行或持久斷言狀態(tài)設(shè)置并“從頭開(kāi)始”。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: