ClassLoader 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
類別載入器是一個負責載入類別的物件。
[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 是抽象類別。 給定類別的二進位名稱,類別載入器應嘗試尋找或產生構成該類別定義的資料。 一個典型的策略是將名稱轉換成一個檔案名稱,然後從檔案系統讀取該名稱的「類別檔案」。
每個java.lang.Class Class物件都包含定義它的 的 Class#getClassLoader() reference 。ClassLoader
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 = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
</區塊引用>
網路類別載入器子類別必須定義方法 #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
. . .
}
}
</區塊引用>
<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(ClassLoader) |
利用指定的父類別載入器建立新的類別載入器以進行委派。 |
| ClassLoader(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| 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() |
將此類別載入器的預設斷言狀態設為 |
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
類別載入器是一個負責載入類別的物件。 (繼承來源 JavaObject) |
| DefineClass(Byte[], Int32, Int32) |
已淘汰.
將一個位元組陣列轉換成類別 |
| DefineClass(String, Byte[], Int32, Int32, ProtectionDomain) |
將一個位元組陣列轉換成類別的 |
| DefineClass(String, Byte[], Int32, Int32) |
將一個位元組陣列轉換成類別 |
| DefineClass(String, ByteBuffer, ProtectionDomain) |
將 a |
| DefinePackage(String, String, String, String, String, String, String, URL) |
在此中以名稱 |
| 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) |
回傳一個代表所有資源的物件枚舉 |
| FindSystemClass(String) |
尋找具有指定二進位名稱的類別,必要時載入。 |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| GetPackage(String) |
在這個類別載入器及其祖先中,依名稱找到一個套件。 |
| GetPackages() |
回傳 |
| 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() |
將來電者註冊為 |
| 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) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
類別載入器是一個負責載入類別的物件。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |