語言

ClassLoader 類別

定義

類別載入器是一個負責載入類別的物件。

[Android.Runtime.Register("java/lang/ClassLoader", DoNotGenerateAcw=true)]
public abstract class ClassLoader : Java.Lang.Object
[<Android.Runtime.Register("java/lang/ClassLoader", DoNotGenerateAcw=true)>]
type ClassLoader = class
    inherit Object
繼承
ClassLoader
衍生
屬性

備註

類別載入器是一個負責載入類別的物件。 這個類別 ClassLoader 是抽象類別。 給定類別的二進位名稱,類別載入器應嘗試尋找或產生構成該類別定義的資料。 一個典型的策略是將名稱轉換成一個檔案名稱,然後從檔案系統讀取該名稱的「類別檔案」。

每個java.lang.Class Class物件都包含定義它的 的 Class#getClassLoader() referenceClassLoader

Class陣列類別的物件並非由類別載入器建立,而是依照 Java 執行時的需求自動建立。 陣列類別的類別載入器(由 Class#getClassLoader() 陣列類別回傳)與其元素類型的類別載入器相同;若元素類型是原始型態,則陣列類別沒有類別載入器。

應用程式實作 的ClassLoader子類別,以擴展 Java 虛擬機動態載入類別的方式。

類別載入器通常可被安全管理者用來指示安全領域。

除了載入類別外,類別載入器也負責資源的定位。 資源是指.class以抽象路徑名稱標示的「」檔案、設定資料或影像。 資源通常會隨應用程式或函式庫一同包裝,以便透過應用程式或函式庫中的程式碼定位它們。 在某些情況下,這些資源是為了讓其他圖書館能找到它們。

ClassLoader 類別使用委派模型來搜尋類別與資源。 每個 的 ClassLoader 實例都有對應的父類別載入器。 當被要求尋找類別或資源時, ClassLoader 實例通常會先將搜尋該類別或資源的任務委派給父類別載入器,再嘗試尋找該類別或資源本身。

支援類別並行載入的類別載入器稱為 <em>#isRegisteredAsParallelCapable() parallel capable</em> 類別載入器,必須在其類別初始化時透過呼叫#registerAsParallelCapable ClassLoader.registerAsParallelCapable該方法來註冊自己。 請注意,該 ClassLoader 類別預設為平行能力。 然而,若子類別具備平行能力,仍需自行註冊。 在委派模型非嚴格階層式的環境中,類別載入器必須具備平行功能,否則類別載入可能導致死結,因為載入器鎖定會持續到類別載入過程(參見 #loadClass loadClass 方法)。

<h2> 「內建載入器」>運行時內建類別載入器</h2>

Java 執行時內建類別載入器如下:

<烏爾><·李>

Bootstrap 類別載入器。 它是虛擬機內建的類別載入器,通常表示為 null,且沒有父程式。</李><莉>

#getSystemClassLoader() 系統類別載入器。 它也被稱為 <em>應用類別載入器</em> ,與平台類別載入器不同。 系統類別載入器通常用於定義應用程式類別路徑、模組路徑及 JDK 專用工具上的類別。 平台類別載入器是系統類別載入器的父或祖先,因此系統類別載入器可以透過委派給父類別來載入平台類別。</li></ul>

通常,Java 虛擬機會依平台不同方式從本地檔案系統載入類別。 然而,有些類別可能並非源自檔案;它們可能來自其他來源,例如網路,或是由應用程式所建構。 此方法 #defineClass(String, byte[], int, int) defineClass 將一個位元組陣列轉換成類別 Class的實例。 此新定義類別的實例可用 Class#newInstance Class.newInstance建立。

類別載入器所建立的物件的方法與建構子可能會參考其他類別。 為了確定所指的類別,Java 虛擬機會#loadClass loadClass呼叫最初建立該類別的類別載入器的方法。

例如,應用程式可以建立網路類別載入器,從伺服器下載類別檔案。 範例程式碼可能如下:

<引用>

ClassLoader loader&nbsp;= new NetworkClassLoader(host,&nbsp;port);
              Object main&nbsp;= loader.loadClass("Main", true).newInstance();
                  &nbsp;.&nbsp;.&nbsp;.

</區塊引用>

網路類別載入器子類別必須定義方法 #findClass findClass ,才能 loadClassData 從網路載入類別。 下載完組成類別的位元組後,應該會使用該方法 #defineClass defineClass 建立類別實例。 範例實作如下:

<引用>

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
                        &nbsp;.&nbsp;.&nbsp;.
                    }
                }

</區塊引用>

<h3> 「二進位名稱」>二進位名稱</h3>

任何作為String方法參數的類別名稱,必須是二進位名稱,依ClassLoader據 cite<定義 Java 語言規範>/cite<>。

有效類別名稱的範例包括: <blockquote>

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

</區塊引用>

任何作為String參數ClassLoader的套件名稱必須是空字串(表示未命名的套件)或由 cite<定義的完全限定名稱,該名稱由 Java 語言規範>/cite< 定義>。

1.0 版本新增。

Java 文件 java.lang.ClassLoader

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

建構函式

名稱 Description
ClassLoader()

建立一個新的類別載入器,使用該方法ClassLoader回傳的 作為#getSystemClassLoader() getSystemClassLoader()父類別載入器。

ClassLoader(ClassLoader)

利用指定的父類別載入器建立新的類別載入器以進行委派。

ClassLoader(IntPtr, JniHandleOwnership)

用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。

屬性

名稱 Description
Class

回傳此 Object的執行時類別。

(繼承來源 Object)
Handle

底層 Android 實例的帳號。

(繼承來源 Object)
JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
JniPeerMembers

取得用於調用此 Java 節點成員的 JNI 元資料。

Parent

回傳父類別載入器以進行委派。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
SystemClassLoader

回傳系統類別載入器。

ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

方法

名稱 Description
ClearAssertionStatus()

將此類別載入器的預設斷言狀態設為 false ,並捨棄與類別載入器相關的套件預設值或類別斷言狀態設定。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
DefineClass(Byte[], Int32, Int32)
已淘汰.

將一個位元組陣列轉換成類別 Class的實例。

DefineClass(String, Byte[], Int32, Int32, ProtectionDomain)

將一個位元組陣列轉換成類別的 Class實例,給定 ProtectionDomain

DefineClass(String, Byte[], Int32, Int32)

將一個位元組陣列轉換成類別 Class的實例。

DefineClass(String, ByteBuffer, ProtectionDomain)

將 a java.nio.ByteBuffer ByteBuffer 轉換為類別 Class的實例,給定 ProtectionDomain

DefinePackage(String, String, String, String, String, String, String, URL)

在此中以名稱 ClassLoader定義一個套件。

Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
Equals(Object)

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
FindClass(String)

找到具有指定二進位名稱的類別。

FindLibrary(String)

回傳原生函式庫的絕對路徑名稱。

FindLoadedClass(String)

若該載入器已被 Java 虛擬機記錄為該二進位名稱類別的啟動載入器,則回傳該二進位名稱的類別。

FindResource(String)

找到帶有名字的資源。

FindResources(String)

回傳一個代表所有資源的物件枚舉 java.net.URL URL ,這些資源與名字相同。

FindSystemClass(String)

尋找具有指定二進位名稱的類別,必要時載入。

GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
GetPackage(String)

在這個類別載入器及其祖先中,依名稱找到一個套件。

GetPackages()

回傳 Package所有由此類別載入器及其前代所定義的 s。

GetResource(String)

找到帶有名字的資源。

GetResourceAsStream(String)

回傳一個用於讀取指定資源的輸入串流。

GetResources(String)

找到所有帶有名字的資源。

GetSystemResource(String)

從載入類別的搜尋路徑中尋找指定名稱的資源。

GetSystemResourceAsStream(String)

開啟讀取,是來自用於載入類別的搜尋路徑中指定名稱的資源。

GetSystemResources(String)

從載入類別的搜尋路徑中,找到所有指定名稱的資源。

JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
LoadClass(String, Boolean)

載入指定的二進位名稱的類別。

LoadClass(String)

載入指定的二進位名稱的類別。

LoadClassAsync(String, Boolean)

非同步載入指定名稱的類別。

LoadClassAsync(String)

非同步載入指定名稱的類別。

Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
RegisterAsParallelCapable()

將來電者註冊為 #isRegisteredAsParallelCapable() parallel capable

ResolveClass(Class)

連結指定的類別。

SetClassAssertionStatus(String, Boolean)

在此類別載入器中,為命名的頂層類別及其內嵌套類別設定所需的斷言狀態。

SetDefaultAssertionStatus(Boolean)

設定此類別載入器的預設斷言狀態。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetPackageAssertionStatus(String, Boolean)

設定該套件的預設斷言狀態。

SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
SetSigners(Class, Object[])

設定一個類別的簽署者。

ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

類別載入器是一個負責載入類別的物件。

(繼承來源 JavaObject)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

類別載入器是一個負責載入類別的物件。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於