JavaTM Platform
Standard Ed. 6

java.rmi.server
クラス RMIClassLoader

java.lang.Object
  上位を拡張 java.rmi.server.RMIClassLoader

public class RMIClassLoader
extends Object

RMIClassLoader は、RMI を使用して動的にクラスをロードするための static メソッドから構成されます。このクラスローダーには、ネットワークの場所 (1 つ以上の URL) からクラスをロードするメソッドや、既存のクラスが格納されている場所を取得するメソッドが組み込まれています。これらのメソッドは、リモートメソッド呼び出しの引数や戻り値に含まれるクラスを整列化および非整列化するときに、RMI ランタイムによって使用されます。 また、これらのメソッドをアプリケーションから直接呼び出して、クラスを動的にロードすることもできます。  

次の static メソッドの実装は、これらのサービスプロバイダインタフェース RMIClassLoaderSpi のインスタンスによって提供されます。

このメソッドのいずれかが呼び出されると、その動作がサービスプロバイダインスタンスの対応するメソッドに委譲されます。各メソッドがプロバイダインスタンスに委譲する方法の詳細は、各メソッドのマニュアルを参照してください。  

サービスプロバイダインスタンスは次のように選択されます。

導入されたバージョン:
JDK1.1
関連項目:
RMIClassLoaderSpi

メソッドの概要
static String getClassAnnotation(Class<?> cl)
          クラス定義の位置を示す注釈文字列を返します。
static ClassLoader getClassLoader(String codebase)
          指定されたコードベース URL パスからクラスをロードするクラスローダーを返します。
static RMIClassLoaderSpi getDefaultProviderInstance()
          サービスプロバイダインタフェース RMIClassLoaderSpi のデフォルトプロバイダの正規インスタンスを返します。
static Object getSecurityContext(ClassLoader loader)
          推奨されていません。 代替はありません。Java 2 プラットフォーム 1.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)
          指定された名前を持つインタフェース群を実装した動的プロキシクラス (Proxy を参照) を、指定されたコードベース URL パスからロードします。
 
クラス 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) メソッドに委譲します。 1 つめの引数には null が、2 つめの引数には name が渡されます。

パラメータ:
name - ロード対象クラスの名前
戻り値:
ロードされたクラスを表す Class オブジェクト
例外:
MalformedURLException - クラスのロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義がコードベースの位置になかった場合
関連項目:
loadClass(String,String)

loadClass

public static Class<?> loadClass(URL codebase,
                                 String name)
                          throws MalformedURLException,
                                 ClassNotFoundException
指定されたコードベース URL からクラスをロードします。 codebasenull である場合、このメソッドの動作は、loadClass(String,String) メソッドの引数に null codebase と同一クラス名を指定した場合と同じになります。  

このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader) メソッドに処理を委譲します。 このとき、指定した URL で URL.toString() を呼び出した結果 (codebase が null の場合は null) が最初の引数として、name が 2 つめの引数として、null が 3 つめの引数として渡されます。

パラメータ:
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 が 2 つめの引数として、null が 3 つめの引数として渡されます。

パラメータ:
codebase - クラスのロード元の URL のリスト (区切り文字はスペース)、または null
name - ロード対象クラスの名前
戻り値:
ロードされたクラスを表す Class オブジェクト
例外:
MalformedURLException - codebasenull 以外でかつ無効な URL を含んでいる場合、または codebasenull でかつクラスのロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義が指定された場所になかった場合
導入されたバージョン:
1.2

loadClass

public static Class<?> loadClass(String codebase,
                                 String name,
                                 ClassLoader defaultLoader)
                          throws MalformedURLException,
                                 ClassNotFoundException
指定されたコードベース URL パスからクラスをロードします。指定されたローダーを使用することもできます。 プロバイダ実装の呼び出し元が、状況に応じて使用すべき追加クラスローダー (呼び出し元のスタック上のローダーなど) をプロバイダ実装に提供する場合に、このメソッドを使用します。通常、プロバイダ実装は、指定された defaultLoader を使用して指定されたクラスの解決を試みたあとで、コードベース URL パスからのクラスの解決を試みます。  

このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader) メソッドに処理を委譲します。 このとき、codebase が最初の引数として、name が 2 つめの引数として、defaultLoader が 3 つめの引数として渡されます。

パラメータ:
codebase - クラスのロード元の URL のリスト (区切り文字はスペース)、または null
name - ロード対象クラスの名前
defaultLoader - 状況に応じて使用する追加クラスローダー、または null
戻り値:
ロードされたクラスを表す Class オブジェクト
例外:
MalformedURLException - codebasenull 以外でかつ無効な URL を含んでいる場合、または codebasenull でかつクラスのロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義が指定された場所になかった場合
導入されたバージョン:
1.4

loadProxyClass

public static Class<?> loadProxyClass(String codebase,
                                      String[] interfaces,
                                      ClassLoader defaultLoader)
                               throws ClassNotFoundException,
                                      MalformedURLException
指定された名前を持つインタフェース群を実装した動的プロキシクラス (Proxy を参照) を、指定されたコードベース URL パスからロードします。  

これらのインタフェースの解決は、指定された codebase を使用して loadClass(String,String) メソッド経由でロードされたクラスと同様の方法で行われます。  

このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.loadProxyClass(String,String[],ClassLoader) メソッドに処理を委譲します。 このとき、codebase が最初の引数として、interfaces が 2 つめの引数として、defaultLoader が 3 つめの引数として渡されます。

パラメータ:
codebase - クラスのロード元の URL のリスト (区切り文字はスペース)、または null
interfaces - プロキシクラスが実装するインタフェースの名前
defaultLoader - 状況に応じて使用する追加クラスローダー、または null
戻り値:
指定されたインタフェースを実装する動的プロキシクラス
例外:
MalformedURLException - codebasenull 以外でかつ無効な 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 - codebasenull 以外でかつ無効な 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 の static メソッドは、サービスプロバイダインスタンスとしてデフォルトプロバイダの正規インスタンスを使用します。  

セキュリティーマネージャーが存在する場合、RuntimePermission("setFactory") アクセス権を使用して checkPermission メソッドが呼び出され、SecurityException がチェックされます。  

デフォルトのサービスプロバイダインスタンスは、RMIClassLoaderSpi を次のように実装します。

 

getClassAnnotation メソッドは、指定されたクラス定義のダウンロードにリモート側が使用するコードベース URL パスを表す String を返します。返される文字列の形式は、空白で区切られた URL のパスです。 返されるコードベースの文字列は、次に示すように、指定されたクラスに定義されているクラスローダーによって異なります。

     

  • 定義されているクラスローダーがシステムクラスローダー (ClassLoader.getSystemClassLoader() を参照)、システムクラスローダーの親 (インストール済みの拡張クラスに使用されるローダーなど)、またはブートストラップクラスローダー (null で表される) の場合、java.rmi.server.codebase プロパティーの値 (または以前にキャッシュされた値) が返される。 このプロパティーの値が設定されていない場合は、null が返される  

  • 定義されているクラスローダーが URLClassLoader のインスタンスの場合は、ローダーの getURLs メソッド呼び出しから返される、外部形式の URL のリスト (区切り文字はスペース) が返される。URLClassLoader がこのプロバイダによって作成され、その loadClass または loadProxyClass メソッドが使用される場合、関連するコードベース文字列を取得するためのアクセス権は必要ない。URLClassLoader インスタンスがこのプロバイダ以外に作成され、セキュリティーマネージャーが存在する場合は、getURLs メソッドから URL が返されるたびに、openConnection().getPermission() 呼び出しによって返されたアクセス権を使用してセキュリティーマネージャーの checkPermission メソッドが呼び出される。 これらの呼び出しのいずれかで SecurityException または IOException がスローされた場合、java.rmi.server.codebase プロパティーの値が返される。 このプロパティーが設定されていない場合は、null が返される  

  • 定義されているクラスローダーが URLClassLoader のインスタンスではない場合、java.rmi.server.codebase プロパティーの値 (または以前にキャッシュされた値) が返される。 このプロパティーが設定されていない場合は、null が返される
 

codebase という名前の String パラメータ (空白で区切られた URL のリスト) を取る、次に説明する各メソッド実装について、メソッドが呼び出されるたびに特定の「コードベースローダー」が関連付けられます。 コードベースローダーは、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 メソッド呼び出しに失敗したとき
導入されたバージョン:
1.4

getSecurityContext

@Deprecated
public static Object getSecurityContext(ClassLoader loader)
推奨されていません。 代替はありません。Java 2 プラットフォーム 1.2 以降の RMI では、クラスローダーのセキュリティーコンテキストを取得するためにこのメソッドを使用しません

指定されたクラスローダーのセキュリティーコンテキストを返します。

パラメータ:
loader - セキュリティーコンテキストの取得元のクラスローダー
戻り値:
セキュリティーコンテキスト
関連項目:
SecurityManager.getSecurityContext()

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。