鴻蒙OS ClassLoader

2022-05-10 15:56 更新

ClassLoader

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ù)組類沒有類加載器。

應(yīng)用程序?qū)崿F(xiàn) ClassLoader 的子類以擴(kuò)展 Java 虛擬機(jī)動(dòng)態(tài)加載類的方式。

安全管理器通??梢允褂妙惣虞d器來指示安全域。

ClassLoader 類使用委托模型來搜索類和資源。 ClassLoader 的每個(gè)實(shí)例都有一個(gè)關(guān)聯(lián)的父類加載器。當(dāng)請(qǐng)求查找類或資源時(shí),ClassLoader 實(shí)例將在嘗試查找類或資源本身之前將對(duì)該類或資源的搜索委托給其父類加載器。虛擬機(jī)的內(nèi)置類加載器,稱為“引導(dǎo)類加載器”,它本身沒有父級(jí),但可以作為 ClassLoader 實(shí)例的父級(jí)。

支持并發(fā)加載類的類加載器被稱為具有并行能力的類加載器,并且需要在類初始化時(shí)通過調(diào)用 ClassLoader.registerAsParallelCapable 方法來注冊(cè)自己。請(qǐng)注意,ClassLoader 類默認(rèn)注冊(cè)為具有并行功能。但是,如果它們具有并行能力,它的子類仍然需要注冊(cè)自己。在委托模型不是嚴(yán)格分層的環(huán)境中,類加載器需要具有并行能力,否則類加載會(huì)導(dǎo)致死鎖,因?yàn)榧虞d器鎖在類加載過程中被持有(參見 loadClass 方法)。

通常,Java 虛擬機(jī)以平臺(tái)相關(guān)的方式從本地文件系統(tǒng)加載類。例如,在 UNIX 系統(tǒng)上,虛擬機(jī)從 CLASSPATH 環(huán)境變量定義的目錄中加載類。

但是,某些類可能不是源自文件;它們可能來自其他來源,例如網(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ò)類加載器來從服務(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來創(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? 語言規(guī)范》定義的二進(jìn)制名稱。

有效類名的示例包括:

   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"

構(gòu)造函數(shù)摘要

修飾符 構(gòu)造函數(shù) 描述
protected ClassLoader() 使用 getSystemClassLoader() 方法返回的 ClassLoader 作為父類加載器創(chuàng)建一個(gè)新的類加載器。
protected ClassLoader(ClassLoader parent) 使用指定的父類加載器為委托創(chuàng)建一個(gè)新的類加載器。

方法總結(jié)

修飾符和類型 方法 描述
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ī)庫的絕對(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) 打開讀取,從用于加載類的搜索路徑中指定名稱的資源。
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

構(gòu)造函數(shù)詳細(xì)信息

ClassLoader

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)建新的類加載器。

ClassLoader

protected ClassLoader()

使用 getSystemClassLoader() 方法返回的 ClassLoader 作為父類加載器創(chuàng)建一個(gè)新的類加載器。

如果存在安全管理器,則調(diào)用其 SecurityManager#checkCreateClassLoader() 方法。 這可能會(huì)導(dǎo)致安全異常。

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且其 checkCreateClassLoader 方法不允許創(chuàng)建新的類加載器。

方法詳情

loadClass

public Class<?> loadClass(String name) throws ClassNotFoundException

加載具有指定二進(jìn)制名稱的類。 此方法以與 loadClass(java.lang.String,boolean) 方法相同的方式搜索類。 Java 虛擬機(jī)調(diào)用它來解析類引用。 調(diào)用此方法等效于調(diào)用 loadClass(name, false)。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 類的二進(jìn)制名稱

返回:

生成的 Class 對(duì)象

Throws:

Throw名稱 Throw描述
ClassNotFoundException 如果找不到類

loadClass

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException

加載具有指定二進(jìn)制名稱的類。 此方法的默認(rèn)實(shí)現(xiàn)按以下順序搜索類:

  1. 調(diào)用 findLoadedClass(java.lang.String) 檢查類是否已經(jīng)加載。
  2. 在父類加載器上調(diào)用 loadClass 方法。 如果 parent 為 null,則使用虛擬機(jī)內(nèi)置的類加載器。
  3. 調(diào)用 findClass(java.lang.String) 方法查找類。

如果使用上述步驟找到了類,并且解析標(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 如果找不到類

findClass

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 如果找不到類

defineClass

@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ù)的長度

返回:

從指定的類數(shù)據(jù)創(chuàng)建的 Class 對(duì)象

Throws:

Throw名稱 Throw描述
ClassFormatError 如果數(shù)據(jù)不包含有效的類
IndexOutOfBoundsException 如果 off 或 len 為負(fù)數(shù),或者 off+len 大于 b.length。
SecurityException 如果嘗試將此類添加到包含由與此類不同的證書集簽名的類的包中,或者嘗試在包中定義具有以開頭的完全限定名稱的類 “java”。

defineClass

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ù)的長度

返回:

從指定的類數(shù)據(jù)創(chuàng)建的 Class 對(duì)象。

Throws:

Throw名稱 Throw描述
ClassFormatError 如果數(shù)據(jù)不包含有效的類
IndexOutOfBoundsException 如果 off 或 len 為負(fù)數(shù),或者 off+len 大于 b.length。
SecurityException 如果嘗試將此類添加到包含由與此類不同的證書集(未簽名)簽名的類的包中,或者名稱以“java.”開頭。

defineClass

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)榭?,則將按照 [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.”開頭,因?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ù)的長度
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.”開頭。

defineClass

protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError

使用可選的 ProtectionDomain 將 ByteBuffer 轉(zhuǎn)換為 Class 類的實(shí)例。 如果域?yàn)榭?,則將按照 [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)生與語句完全相同的結(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.”開頭。

resolveClass

protected final void resolveClass(Class<?> c)

鏈接指定的類。 類加載器可以使用這個(gè)(誤導(dǎo)性的)方法來鏈接一個(gè)類。 如果類 c 已經(jīng)被鏈接,那么這個(gè)方法簡單地返回。 否則,該類將按照《Java? 語言規(guī)范》的“執(zhí)行”一章中的說明進(jìn)行鏈接。

參數(shù):

參數(shù)名稱 參數(shù)描述
c 要鏈接的類

Throws:

Throw名稱 Throw描述
NullPointerException 如果 c 為空。

findSystemClass

protected final Class<?> findSystemClass(String name) throws ClassNotFoundException

查找具有指定二進(jìn)制名稱的類,并在必要時(shí)加載它。

此方法通過系統(tǒng)類加載器加載類(參見 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 如果找不到類

findLoadedClass

protected final Class<?> findLoadedClass(String name)

如果 Java 虛擬機(jī)將此加載器記錄為具有該二進(jìn)制名稱的類的初始加載器,則返回具有給定二進(jìn)制名稱的類。 否則返回 null。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 類的二進(jìn)制名稱

返回:

Class 對(duì)象,如果尚未加載該類,則為 null

setSigners

protected final void setSigners(Class<?> c, Object[] signers)

設(shè)置類的簽名者。 這應(yīng)該在定義一個(gè)類之后調(diào)用。

參數(shù):

參數(shù)名稱 參數(shù)描述
c 類對(duì)象
signers 類的簽名者

getResource

public URL getResource(String name)

查找具有給定名稱的資源。 資源是可以由類代碼以獨(dú)立于代碼位置的方式訪問的一些數(shù)據(jù)(圖像、音頻、文本等)。

資源的名稱是一個(gè)以“/”分隔的路徑名,用于標(biāo)識(shí)該資源。

該方法將首先在父類加載器中搜索資源; 如果 parent 為 null,則搜索虛擬機(jī)內(nèi)置的類加載器的路徑。 如果失敗,此方法將調(diào)用 findResource(java.lang.String) 來查找資源。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 資源名稱

返回:

用于讀取資源的 URL 對(duì)象,如果找不到資源或調(diào)用者沒有足夠的權(quán)限來獲取資源,則返回 null。

getResources

public EnumerationURL getResources(String name) throws IOException

查找具有給定名稱的所有資源。 資源是可以由類代碼以獨(dú)立于代碼位置的方式訪問的一些數(shù)據(jù)(圖像、音頻、文本等)。

資源的名稱是標(biāo)識(shí)資源的 / 分隔的路徑名。

getResource(java.lang.String) 的文檔中描述了搜索順序。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 資源名稱

返回:

資源的 URL 對(duì)象的枚舉。 如果找不到資源,則枚舉將為空。 類加載器無權(quán)訪問的資源不會(huì)出現(xiàn)在枚舉中。

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯(cuò)誤

findResource

protected URL findResource(String name)

查找具有給定名稱的資源。 類加載器實(shí)現(xiàn)應(yīng)覆蓋此方法以指定在何處查找資源。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 資源名稱

返回:

用于讀取資源的 URL 對(duì)象,如果找不到資源,則返回 null

findResources

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ò)誤

registerAsParallelCapable

protected static boolean registerAsParallelCapable()

將調(diào)用者注冊(cè)為具有并行能力。 當(dāng)且僅當(dāng)滿足以下所有條件時(shí),注冊(cè)成功:

  1. 沒有創(chuàng)建調(diào)用者實(shí)例
  2. 調(diào)用者的所有超類(Object 類除外)都注冊(cè)為具有并行能力

請(qǐng)注意,一旦類加載器注冊(cè)為具有并行能力,就無法將其更改回來。

返回:

如果調(diào)用者成功注冊(cè)為具有并行能力,則為 true,否則為 false。

getSystemResource

public static URL getSystemResource(String name)

從用于加載類的搜索路徑中查找指定名稱的資源。 此方法通過系統(tǒng)類加載器定位資源(請(qǐng)參閱 getSystemClassLoader())。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 資源名稱

返回:

用于讀取資源的 URL 對(duì)象,如果找不到資源,則返回 null

getSystemResources

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ò)誤

getResourceAsStream

public InputStream getResourceAsStream(String name)

返回用于讀取指定資源的輸入流。

getResource(java.lang.String) 的文檔中描述了搜索順序。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 資源名稱

返回:

用于讀取資源的輸入流,如果找不到資源,則返回 null

getSystemResourceAsStream

public static InputStream getSystemResourceAsStream(String name)

打開讀取,從用于加載類的搜索路徑中指定名稱的資源。 此方法通過系統(tǒng)類加載器定位資源(請(qǐng)參閱 getSystemClassLoader())。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 資源名稱

返回:

用于讀取資源的輸入流,如果找不到資源,則返回 null

getParent

public final ClassLoader getParent()

返回委托的父類加載器。 一些實(shí)現(xiàn)可能使用 null 來表示引導(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ì)父類加載器的訪問權(quán)限。 如果沒有,將拋出 SecurityException。

返回:

父類加載器

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法不允許訪問此類加載器的父類加載器。

getSystemClassLoader

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)限來驗(yàn)證對(duì)系統(tǒng)類加載器的訪問。如果沒有,將拋出 SecurityException。

返回:

用于委托的系統(tǒng) ClassLoader,如果沒有則為 null

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法不允許訪問系統(tǒng)類加載器。
IllegalStateException 如果在構(gòu)造由“java.system.class.loader”屬性指定的類加載器期間遞歸調(diào)用。
Error 如果定義了系統(tǒng)屬性“java.system.class.loader”但無法加載命名類,則提供程序類未定義所需的構(gòu)造函數(shù),或者該構(gòu)造函數(shù)在調(diào)用時(shí)拋出異常。 可以通過 Throwable#getCause() 方法檢索錯(cuò)誤的根本原因。

definePackage

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ù)

getPackage

protected Package getPackage(String name)

返回已由此類加載器或其任何祖先定義的包。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 包名

返回:

與給定名稱對(duì)應(yīng)的包,如果未找到,則返回 null

getPackages

protected Package[] getPackages()

返回此類加載器及其祖先定義的所有包。

返回:

此 ClassLoader 定義的 Package 對(duì)象數(shù)組

findLibrary

protected String findLibrary(String libname)

返回本機(jī)庫的絕對(duì)路徑名。 VM 調(diào)用此方法來定位屬于使用此類加載器加載的類的本機(jī)庫。 如果此方法返回 null,VM 將沿著指定為“java.library.path”屬性的路徑搜索庫。

參數(shù):

參數(shù)名稱 參數(shù)描述
libname 圖書館名稱

返回:

本機(jī)庫的絕對(duì)路徑

setDefaultAssertionStatus

public void setDefaultAssertionStatus(boolean enabled)

設(shè)置此類加載器的默認(rèn)斷言狀態(tài)。 此設(shè)置確定由此類加載器加載并在將來初始化的類是否默認(rèn)啟用或禁用斷言。 通過調(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。

setPackageAssertionStatus

public void setPackageAssertionStatus(String packageName, boolean enabled)

設(shè)置命名包的包默認(rèn)斷言狀態(tài)。 包默認(rèn)斷言狀態(tài)決定了將來初始化的屬于指定包或其任何“子包”的類的斷言狀態(tài)。

名為 p 的包的子包是名稱以“p.”開頭的任何包。 例如 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),并且可以通過調(diào)用 setClassAssertionStatus(java.lang.String,boolean) 在每個(gè)類的基礎(chǔ)上覆蓋。

參數(shù):

參數(shù)名稱 參數(shù)描述
packageName 要設(shè)置其包默認(rèn)斷言狀態(tài)的包的名稱。 空值表示“當(dāng)前”的未命名包(請(qǐng)參閱《Java? 語言規(guī)范》的第 7.4.2 節(jié)。)
enabled 如果此類加載器加載的屬于命名包或其任何子包的類默認(rèn)啟用斷言,則返回 true;如果默認(rèn)禁用斷言,則返回 false。

setClassAssertionStatus

public void setClassAssertionStatus(String className, boolean enabled)

為此類加載器中的命名頂級(jí)類和其中包含的任何嵌套類設(shè)置所需的斷言狀態(tài)。 此設(shè)置優(yōu)先于類加載器的默認(rèn)斷言狀態(tài),以及任何適用的每個(gè)包的默認(rèn)值。 如果命名類已經(jīng)初始化,則此方法無效。 (一旦一個(gè)類被初始化,它的斷言狀態(tài)就不能改變。)

如果命名類不是頂級(jí)類,則此調(diào)用不會(huì)影響任何類的實(shí)際斷言狀態(tài)。

參數(shù):

參數(shù)名稱 參數(shù)描述
className 要設(shè)置其斷言狀態(tài)的頂級(jí)類的完全限定類名。
enabled 如果命名類在初始化時(shí)(如果)要啟用斷言,則為 true,如果要禁用該類的斷言,則為 false。

clearAssertionStatus

public void clearAssertionStatus()

將此類加載器的默認(rèn)斷言狀態(tài)設(shè)置為 false 并丟棄與類加載器關(guān)聯(lián)的任何包默認(rèn)值或類斷言狀態(tài)設(shè)置。 提供此方法是為了使類加載器可以忽略任何命令行或持久斷言狀態(tài)設(shè)置并“從頭開始”。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)