JavaTM 2 Platform
Standard Ed. 6

java.rmi.server
類別 RMIClassLoader

java.lang.Object
  繼承者 java.rmi.server.RMIClassLoader

public class RMIClassLoader
extends Object

RMIClassLoader 套件含支持用 RMI 進行動態類別載入的靜態方法。包含從網路位置(一個或多個 URL)載入類別和獲取遠端方應從其載入現有類別的位置的方法。這些方法由 RMI 運行資源庫在編組和解組參數中包含的類別時使用,將返回遠端方法調用的值,並且還可以由應用程序直接調用,以模仿 RMI 的動態類別載入行為。

以下靜態方法的實作

由這些方法的服務提供者介面 RMIClassLoaderSpi 的實例提供。當調用這些方法之一時,其行為是向服務提供者實例委託相應的方法。有關每個方法如何委託給提供者實例的詳細資訊,在各自特定方法的文檔中進行了描述。

服務提供者實例按以下方式選擇:

從以下版本開始:
JDK1.1
另請參見:
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
 

方法詳細資訊

loadClass

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

loadClass

public static Class<?> loadClass(URL codebase,
                                 String name)
                          throws MalformedURLException,
                                 ClassNotFoundException
從基本程式碼 URL 載入類別。 如果 codebasenull,則此方法將與具有 nullcodebase 和給定類別名的 loadClass(String,String) 行為相同。

此方法委託給提供者實例的 RMIClassLoaderSpi.loadClass(String,String,ClassLoader) 方法,將在給定 URL 上調用 URL.toString() 的結果(或者如果 codebase 為 null,則為 null)作為第一個參數、name 為第二個參數和 null 為第三個參數進行傳遞。

參數:
codebase - 要從其載入類別的 URL,或 null
name - 要載入的類別的名稱
返回:
表示載入的類別的 Class 物件
拋出:
MalformedURLException - 如果 codebasenull 且用於載入類別的特定於提供者的 URL 無效
ClassNotFoundException - 如果在指定 URL 無法找到該類別的定義

loadClass

public static Class<?> loadClass(String codebase,
                                 String name)
                          throws MalformedURLException,
                                 ClassNotFoundException
從基本程式碼 URL 路徑載入類別。

此方法委託給提供者實例的 RMIClassLoaderSpi.loadClass(String,String,ClassLoader) 方法,將 codebase 作為第一個參數、name 為第二個參數和 null 為第三個參數進行傳遞。

參數:
codebase - 要從其載入類別的 URL 的列表(由空格分隔),或者為 null
name - 要載入的類別的名稱
返回:
表示載入的類別的 Class 物件
拋出:
MalformedURLException - 如果 codebase 為非 null 且包含一個無效 URL,或者如果 codebasenull 且用於載入類別的特定於提供者的 URL 無效。
ClassNotFoundException - 如果在指定位置無法找到該類別的定義
從以下版本開始:
1.2

loadClass

public static Class<?> loadClass(String codebase,
                                 String name,
                                 ClassLoader defaultLoader)
                          throws MalformedURLException,
                                 ClassNotFoundException
有選擇地使用提供的載入器從基本程式碼 URL 路徑載入類別。當調用方想讓要考慮的其他上下文類別載入器(如堆疊(stack)空間上的調用方載入器)可用於提供者實作時應該使用此方法。通常,提供者實作將試圖先使用給定的 defaultLoader(如果指定)解析指定的類別,然後才試圖從程式碼基 URL 路徑解析該類別。

此方法委託給提供者實例的 RMIClassLoaderSpi.loadClass(String,String,ClassLoader) 方法,將 codebase 作為第一個參數、name 為第二個參數和 defaultLoader 為第三個參數進行傳遞。

參數:
codebase - 要從其載入類別的 URL 的列表(由空格分隔),或者為 null
name - 要載入的類別的名稱
defaultLoader - 要使用的其他上下文類別載入器,或 null
返回:
表示載入的類別的 Class 物件
拋出:
MalformedURLException - 如果 codebase 為非 null 且包含一個無效 URL,或者如果 codebasenull 且用於載入類別的特定於提供者的 URL 無效。
ClassNotFoundException - 如果在指定位置無法找到該類別的定義
從以下版本開始:
1.4

loadProxyClass

public static Class<?> loadProxyClass(String codebase,
                                      String[] interfaces,
                                      ClassLoader defaultLoader)
                               throws ClassNotFoundException,
                                      MalformedURLException
從基本程式碼 URL 路徑載入一個實作一組具有給定名稱的介面的動態代理類別(請參閱 Proxy)。

將解析的介面類似於通過使用給定 codebaseloadClass(String,String) 方法載入的類別。

此方法委託給提供者實例的 RMIClassLoaderSpi.loadProxyClass(String,String[],ClassLoader) 方法,將 codebase 作為第一個參數、interfaces 為第二個參數和 defaultLoader 為第三個參數進行傳遞。

參數:
codebase - 要從其載入類別的 URL 列表(由空格分隔),或 null
interfaces - 要實作的代理類別的介面名稱
defaultLoader - 要使用的其他上下文類別載入器,或 null
返回:
實作指定介面的動態代理類別
拋出:
MalformedURLException - 如果 codebase 為非 null 且包含一個無效 URL,或者如果 codebasenull 且用於載入類別的特定於提供者的 URL 無效。
ClassNotFoundException - 如果在指定位置無法找到某個指定介面的定義,或者如果動態代理類別的創建失敗(例如,如果 Proxy.getProxyClass(ClassLoader,Class[]) 拋出給定介面列表的 IllegalArgumentException
從以下版本開始:
1.4

getClassLoader

public static ClassLoader getClassLoader(String codebase)
                                  throws MalformedURLException,
                                         SecurityException
返回從給定的基本程式碼 URL 路徑載入類別的類別載入器。

返回的類別載入器是 loadClass(String,String) 方法將用來載入相同 codebase 參數的類別的類別載入器。

此方法委託給提供者實例的 RMIClassLoaderSpi.getClassLoader(String) 方法,將 codebase 作為第一個參數進行傳遞。

如果存在安全管理器,則使用 RuntimePermission("getClassLoader") 權限調用其 checkPermission 方法;這會導致 SecurityException。此方法的提供者實作還可以執行進一步的安全檢查,以驗證調用上下文是否具有連接到程式碼基 URL 路徑中的所有 URL 的權限。

參數:
codebase - 返回的類別載入器將從其載入類別的 URL 列表(由空格分隔),或 null
返回:
從給定程式碼基 URL 路徑載入類別的類別載入器
拋出:
MalformedURLException - 如果 codebase 為非 null 且包含一個無效 URL,或者如果 codebasenull 且用於標識類別載入器的特定於提供方的 URL 無效
SecurityException - 如果存在安全管理器且其 checkPermission 方法的調用失敗,或者如果調用方沒有連接到程式碼基 URL 路徑中所有 URL 的權限
從以下版本開始:
1.3

getClassAnnotation

public static String getClassAnnotation(Class<?> cl)
返回表示類別定義位置的註釋字元串,RMI 將在編組給定類別的物件時用其註釋類別描述符。

此方法委託給提供者實例的 RMIClassLoaderSpi.getClassAnnotation(Class) 方法,將 cl 作為第一個參數進行傳遞。

參數:
cl - 要獲得其註釋的類別
返回:
在編組時用於註釋給定類別的字元串,或 null
拋出:
NullPointerException - 如果 clnull
從以下版本開始:
1.2

getDefaultProviderInstance

public static RMIClassLoaderSpi getDefaultProviderInstance()
返回服務提供者介面 RMIClassLoaderSpi 的預設提供者的規範化實例。如果未定義系統屬性 java.rmi.server.RMIClassLoaderSpi,則 RMIClassLoader 靜態方法 將把預設提供者的規範化實例用作服務提供者實例。

如果存在安全管理器,則使用 RuntimePermission("setFactory") 權限調用其 checkPermission 方法;這會導致 SecurityException

預設服務提供者實例按以下方式實作 RMIClassLoaderSpi

getClassAnnotation 方法返回一個表示基本程式碼 URL 路徑的 String,遠端方應使用該路徑下載指定類別的定義。返回的字元串的格式是一個由空格分隔的 URL 路徑。 返回的基本程式碼字元串取決於指定類別的定義類別載入器:

  • 如果類別載入器是系統類別載入器(請參閱 ClassLoader.getSystemClassLoader())、系統類別載入器的父級(如,用於安裝擴展的載入器) 或引導類別載入器(可以用 null 表示),則返回 java.rmi.server.codebase 屬性的值(或可能是一個原先的快取記憶體值);如果未設置該屬性,則返回 null

  • 否則,如果類別載入器是 URLClassLoader 的實例,則返回的字元串是一個 URL 的外部形式的由空格分隔的列表,該 URL 通過調用載入器 getURLs 方法返回。如果 URLClassLoader 由此提供者創建,用於調用其 loadClassloadProxyClass 方法,則不需要任何權限即可獲取關聯的基本程式碼字元串。如果它是其他任意一個 URLClassLoader 實例,則如果存在安全管理器,則對於 getURLs 方法返回的每個 URL 都要調用一次其 checkPermission 方法(所用的權限為對每個 URL 調用 openConnection().getPermission() 返回的權限);如果這些調用的任何一個拋出 SecurityExceptionIOException,則返回 java.rmi.server.codebase 屬性的值(或可能是原先的快取記憶體值);如果未設置該屬性,則返回 null

  • 最後,如果類別載入器不是 URLClassLoader 的實例,則返回 java.rmi.server.codebase 屬性的值(或可能是原先的快取記憶體值);如果未設置該屬性,則返回 null

對於下面描述的方法的實作,這些實作都採用作為由空格分隔的 URL 列表的名為 codebaseString 參數,每個調用都有一個關聯的基本程式碼載入器,它通過將 codebase 與當前執行緒的上下文類別載入器一起使用進行標識(請參閱 Thread.getContextClassLoader())。存在安全管理器時,此提供者將維護類別載入器實例(至少是 URLClassLoader 的實例)的內部表,這些內部表通過其父類別載入器及其基本程式碼 URL 路徑(排序的 URL 列表)鍵入。如果 codebasenull,則基本程式碼 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 方法的調用將失敗
從以下版本開始:
1.4

getSecurityContext

@Deprecated
public static Object getSecurityContext(ClassLoader loader)
已過時。 無替換版本。從 Java 2 平臺 v1.2 開始,RMI 不再使用此方法來獲取類別載入器的安全上下文。

返回給定類別載入器的安全上下文。

參數:
loader - 從其獲取安全上下文的類別載入器
返回:
安全上下文
另請參見:
SecurityManager.getSecurityContext()

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only