|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.rmi.server.RMIClassLoader
public class RMIClassLoader
RMIClassLoader
套件含支持用 RMI 進行動態類別載入的靜態方法。包含從網路位置(一個或多個 URL)載入類別和獲取遠端方應從其載入現有類別的位置的方法。這些方法由 RMI 運行資源庫在編組和解組參數中包含的類別時使用,將返回遠端方法調用的值,並且還可以由應用程序直接調用,以模仿 RMI 的動態類別載入行為。
以下靜態方法的實作
loadClass(URL,String)
loadClass(String,String)
loadClass(String,String,ClassLoader)
loadProxyClass(String,String[],ClassLoader)
getClassLoader(String)
getClassAnnotation(Class)
RMIClassLoaderSpi
的實例提供。當調用這些方法之一時,其行為是向服務提供者實例委託相應的方法。有關每個方法如何委託給提供者實例的詳細資訊,在各自特定方法的文檔中進行了描述。
服務提供者實例按以下方式選擇:
java.rmi.server.RMIClassLoaderSpi
,則其值等於字元串 "default"
時,提供者實例將是調用 getDefaultProviderInstance()
方法返回的值;對於任何其他值,如果可以通過系統類別載入器(請參閱 ClassLoader.getSystemClassLoader()
)載入用屬性值命名的類別,並且該類別可以分派給 RMIClassLoaderSpi
且具有一個公共無參數的建構子,則調用建構子來創建提供者實例。如果定義了屬性,但這些條件的所有其他項都不為 true,則向嘗試使用 RMIClassLoader
的程式碼拋出一個不確定的 Error
,以指示獲取提供者實例失敗。
META-INF/services/java.rmi.server.RMIClassLoaderSpi
的資源對於系統類別載入器來說是可見的,則將該資源的內容解釋為提供者配置檔案,並將在該檔案中指定的第一個類別名稱用作提供者類別名稱。如果可以通過系統類別載入器載入具有該名稱的類別,並且該類別可分派給 RMIClassLoaderSpi
且有一個公共無參數的建構子,則調用該建構子以創建提供者實例。如果找到了資源,但無法按描述的方式實例化提供者,則向嘗試使用 RMIClassLoader
的程式碼拋出一個不確定的 Error
,以指示未成功獲得提供者實例。
getDefaultProviderInstance()
方法返回的值。
RMIClassLoaderSpi
方法摘要 | |
---|---|
static String |
getClassAnnotation(Class<?> cl)
返回表示類別定義位置的註釋字元串,RMI 將在編組給定類別的物件時用其註釋類別描述符。 |
static ClassLoader |
getClassLoader(String codebase)
返回從給定的基本程式碼 URL 路徑載入類別的類別載入器。 |
static RMIClassLoaderSpi |
getDefaultProviderInstance()
返回服務提供者介面 RMIClassLoaderSpi 的預設提供者的規範化實例。 |
static Object |
getSecurityContext(ClassLoader loader)
已過時。 無替換版本。從 Java 2 平臺 v1.2 開始,RMI 不再使用此方法來獲取類別載入器的安全上下文。 |
static Class<?> |
loadClass(String name)
已過時。 由 loadClass(String,String) 方法取代 |
static Class<?> |
loadClass(String codebase,
String name)
從基本程式碼 URL 路徑載入類別。 |
static Class<?> |
loadClass(String codebase,
String name,
ClassLoader defaultLoader)
有選擇地使用提供的載入器從基本程式碼 URL 路徑載入類別。 |
static Class<?> |
loadClass(URL codebase,
String name)
從基本程式碼 URL 載入類別。 |
static Class<?> |
loadProxyClass(String codebase,
String[] interfaces,
ClassLoader defaultLoader)
從基本程式碼 URL 路徑載入一個實作一組具有給定名稱的介面的動態代理類別(請參閱 Proxy )。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
方法詳細資訊 |
---|
@Deprecated public static Class<?> loadClass(String name) throws MalformedURLException, ClassNotFoundException
loadClass(String,String)
方法取代
name
的類別。
此方法委託給 loadClass(String,String)
,將 null
作為第一個參數,將 name
作為第二個參數進行傳遞。
name
- 要載入的類別的名稱
Class
物件
MalformedURLException
- 如果用於載入類別的特定於提供者的 URL 無效
ClassNotFoundException
- 如果在基本程式碼基無法找到該類別的定義loadClass(String,String)
public static Class<?> loadClass(URL codebase, String name) throws MalformedURLException, ClassNotFoundException
codebase
為 null
,則此方法將與具有 null
、codebase
和給定類別名的 loadClass(String,String)
行為相同。
此方法委託給提供者實例的 RMIClassLoaderSpi.loadClass(String,String,ClassLoader)
方法,將在給定 URL 上調用 URL.toString()
的結果(或者如果 codebase
為 null,則為 null
)作為第一個參數、name
為第二個參數和 null
為第三個參數進行傳遞。
codebase
- 要從其載入類別的 URL,或 null
name
- 要載入的類別的名稱
Class
物件
MalformedURLException
- 如果 codebase
為 null
且用於載入類別的特定於提供者的 URL 無效
ClassNotFoundException
- 如果在指定 URL 無法找到該類別的定義public static Class<?> loadClass(String codebase, String name) throws MalformedURLException, ClassNotFoundException
此方法委託給提供者實例的 RMIClassLoaderSpi.loadClass(String,String,ClassLoader)
方法,將 codebase
作為第一個參數、name
為第二個參數和 null
為第三個參數進行傳遞。
codebase
- 要從其載入類別的 URL 的列表(由空格分隔),或者為 null
name
- 要載入的類別的名稱
Class
物件
MalformedURLException
- 如果 codebase
為非 null
且包含一個無效 URL,或者如果 codebase
為 null
且用於載入類別的特定於提供者的 URL 無效。
ClassNotFoundException
- 如果在指定位置無法找到該類別的定義public static Class<?> loadClass(String codebase, String name, ClassLoader defaultLoader) throws MalformedURLException, ClassNotFoundException
defaultLoader
(如果指定)解析指定的類別,然後才試圖從程式碼基 URL 路徑解析該類別。
此方法委託給提供者實例的 RMIClassLoaderSpi.loadClass(String,String,ClassLoader)
方法,將 codebase
作為第一個參數、name
為第二個參數和 defaultLoader
為第三個參數進行傳遞。
codebase
- 要從其載入類別的 URL 的列表(由空格分隔),或者為 null
name
- 要載入的類別的名稱defaultLoader
- 要使用的其他上下文類別載入器,或 null
Class
物件
MalformedURLException
- 如果 codebase
為非 null
且包含一個無效 URL,或者如果 codebase
為 null
且用於載入類別的特定於提供者的 URL 無效。
ClassNotFoundException
- 如果在指定位置無法找到該類別的定義public static Class<?> loadProxyClass(String codebase, String[] interfaces, ClassLoader defaultLoader) throws ClassNotFoundException, MalformedURLException
Proxy
)。
將解析的介面類似於通過使用給定 codebase
的 loadClass(String,String)
方法載入的類別。
此方法委託給提供者實例的 RMIClassLoaderSpi.loadProxyClass(String,String[],ClassLoader)
方法,將 codebase
作為第一個參數、interfaces
為第二個參數和 defaultLoader
為第三個參數進行傳遞。
codebase
- 要從其載入類別的 URL 列表(由空格分隔),或 null
interfaces
- 要實作的代理類別的介面名稱defaultLoader
- 要使用的其他上下文類別載入器,或 null
MalformedURLException
- 如果 codebase
為非 null
且包含一個無效 URL,或者如果 codebase
為 null
且用於載入類別的特定於提供者的 URL 無效。
ClassNotFoundException
- 如果在指定位置無法找到某個指定介面的定義,或者如果動態代理類別的創建失敗(例如,如果 Proxy.getProxyClass(ClassLoader,Class[])
拋出給定介面列表的 IllegalArgumentException
)public static ClassLoader getClassLoader(String codebase) throws MalformedURLException, SecurityException
返回的類別載入器是 loadClass(String,String)
方法將用來載入相同 codebase
參數的類別的類別載入器。
此方法委託給提供者實例的 RMIClassLoaderSpi.getClassLoader(String)
方法,將 codebase
作為第一個參數進行傳遞。
如果存在安全管理器,則使用 RuntimePermission("getClassLoader")
權限調用其 checkPermission
方法;這會導致 SecurityException
。此方法的提供者實作還可以執行進一步的安全檢查,以驗證調用上下文是否具有連接到程式碼基 URL 路徑中的所有 URL 的權限。
codebase
- 返回的類別載入器將從其載入類別的 URL 列表(由空格分隔),或 null
MalformedURLException
- 如果 codebase
為非 null
且包含一個無效 URL,或者如果 codebase
為 null
且用於標識類別載入器的特定於提供方的 URL 無效
SecurityException
- 如果存在安全管理器且其 checkPermission
方法的調用失敗,或者如果調用方沒有連接到程式碼基 URL 路徑中所有 URL 的權限public static String getClassAnnotation(Class<?> cl)
此方法委託給提供者實例的 RMIClassLoaderSpi.getClassAnnotation(Class)
方法,將 cl
作為第一個參數進行傳遞。
cl
- 要獲得其註釋的類別
null
NullPointerException
- 如果 cl
為 null
public static RMIClassLoaderSpi getDefaultProviderInstance()
RMIClassLoaderSpi
的預設提供者的規範化實例。如果未定義系統屬性 java.rmi.server.RMIClassLoaderSpi
,則 RMIClassLoader
靜態方法
loadClass(URL,String)
loadClass(String,String)
loadClass(String,String,ClassLoader)
loadProxyClass(String,String[],ClassLoader)
getClassLoader(String)
getClassAnnotation(Class)
如果存在安全管理器,則使用 RuntimePermission("setFactory")
權限調用其 checkPermission
方法;這會導致 SecurityException
。
預設服務提供者實例按以下方式實作 RMIClassLoaderSpi
:
getClassAnnotation
方法返回一個表示基本程式碼 URL 路徑的String
,遠端方應使用該路徑下載指定類別的定義。返回的字元串的格式是一個由空格分隔的 URL 路徑。 返回的基本程式碼字元串取決於指定類別的定義類別載入器:
- 如果類別載入器是系統類別載入器(請參閱
ClassLoader.getSystemClassLoader()
)、系統類別載入器的父級(如,用於安裝擴展的載入器) 或引導類別載入器(可以用null
表示),則返回java.rmi.server.codebase
屬性的值(或可能是一個原先的快取記憶體值);如果未設置該屬性,則返回null
。- 否則,如果類別載入器是
URLClassLoader
的實例,則返回的字元串是一個 URL 的外部形式的由空格分隔的列表,該 URL 通過調用載入器getURLs
方法返回。如果URLClassLoader
由此提供者創建,用於調用其loadClass
或loadProxyClass
方法,則不需要任何權限即可獲取關聯的基本程式碼字元串。如果它是其他任意一個URLClassLoader
實例,則如果存在安全管理器,則對於getURLs
方法返回的每個 URL 都要調用一次其checkPermission
方法(所用的權限為對每個 URL 調用openConnection().getPermission()
返回的權限);如果這些調用的任何一個拋出SecurityException
或IOException
,則返回java.rmi.server.codebase
屬性的值(或可能是原先的快取記憶體值);如果未設置該屬性,則返回null
。- 最後,如果類別載入器不是
URLClassLoader
的實例,則返回java.rmi.server.codebase
屬性的值(或可能是原先的快取記憶體值);如果未設置該屬性,則返回null
。對於下面描述的方法的實作,這些實作都採用作為由空格分隔的 URL 列表的名為
codebase
的String
參數,每個調用都有一個關聯的基本程式碼載入器,它通過將codebase
與當前執行緒的上下文類別載入器一起使用進行標識(請參閱Thread.getContextClassLoader()
)。存在安全管理器時,此提供者將維護類別載入器實例(至少是URLClassLoader
的實例)的內部表,這些內部表通過其父類別載入器及其基本程式碼 URL 路徑(排序的 URL 列表)鍵入。如果codebase
為null
,則基本程式碼 URL 路徑是系統屬性java.rmi.server.codebase
的值,或可能是原先的快取記憶體值。對於給定的基本程式碼 URL 路徑(該路徑作為codebase
參數傳遞到下面給定上下文中的方法之一的調用),基本程式碼載入器位於具有指定基本程式碼 URL 路徑的表中且當前執行緒的上下文類別載入器是其父級的載入器。如果不存在這樣的載入器,則創建一個這樣的載入器並將其添加到表中。該表不維護對其包含的載入器的強參考,以便於允許它們及其定義類別在不可另外到達時被垃圾回收。為了防止不受信任的任意程式碼被隱式載入到不帶安全管理器的虛擬機器中,如果未設置安全管理器,則基本程式碼載入器就是當前執行緒的上下文類別載入器(提供的基本程式碼 URL 路徑被忽略,所以禁止了遠端類別載入)。
getClassLoader
方法返回指定基本程式碼 URL 路徑的基本程式碼載入器。如果存在安全管理器,則如果該調用上下文沒有連接到基本程式碼 URL 路徑上的所有 URL 的權限,則拋出SecurityException
。
loadClass
方法嘗試按以下方式載入具有指定名稱的類別:如果defaultLoader
為非null
,則它首先嘗試使用defaultLoader
載入具有指定name
的類別,比如通過評估Class.forName(name, false, defaultLoader)如果從defaultLoader
成功載入了類別,則返回該類別。如果拋出ClassNotFoundException
之外的異常,則該異常被拋給調用方。其次,
loadClass
方法嘗試使用指定基本程式碼 URL 路徑的基本程式碼載入器載入具有指定name
的類別。如果存在安全管理器,則該調用上下文必須具有連接到基本程式碼 URL 上的所有 URL 的權限;否則,將使用當前執行緒的上下文類別載入器,而不是基本程式碼載入器。
loadProxyClass
方法嘗試按以下方式返回具有指定介面的動態代理類別:如果
defaultLoader
參數為非null
且可以通過該載入器解析所有指定介面,則,
- 如果所有解析的介面都為
public
,則它首先嘗試獲得在基本程式碼載入器中定義的解析介面的動態代理類別(使用Proxy.getProxyClass
);如果該嘗試拋出一個IllegalArgumentException
,則它嘗試獲得在defaultLoader
中定義的解析介面的動態代理類別。如果兩個嘗試都拋出IllegalArgumentException
,則此方法將拋出ClassNotFoundException
。如果拋出任何其他異常,則該異常將被拋給調用方。- 如果在同一類別載入器中定義所有非
public
解析介面,則其嘗試獲得在該載入器中定義的解析介面的動態代理類別。- 否則,拋出
LinkageError
(因為實作所有指定介面的類別無法在任何載入器中定義)。否則,如果所有指定的介面可通過基本程式碼載入器解析,則,
- 如果所有解析介面都為
public
,則它嘗試獲得基本程式碼中解析介面的動態代理類別。如果該嘗試拋出IllegalArgumentException
,則此方法拋出一個ClassNotFoundException
。- 如果在同一類別載入器中定義所有非
public
解析介面,則它嘗試獲得在該載入器中定義的解析介面的動態代理類別。- 否則,拋出
LinkageError
(因為實作所有指定介面的類別無法在任何載入器中定義)。否則,將為每個無法解析的指定介面拋出
ClassNotFoundException
。
SecurityException
- 如果存在安全管理器,且其 checkPermission
方法的調用將失敗@Deprecated public static Object getSecurityContext(ClassLoader loader)
loader
- 從其獲取安全上下文的類別載入器
SecurityManager.getSecurityContext()
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。