JavaTM 2
Platform
Std. Ed. v1.4.0

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)
          指定された名前のインタフェースをコードベース URL パスから実装する動的プロキシクラス (Proxy を参照) をロードします。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

メソッドの詳細

loadClass

public static Class loadClass(String name)
                       throws MalformedURLException,
                              ClassNotFoundException
推奨されていません。 loadClass(String,String) メソッドに置き換えられました。

java.rmi.server.codebase プロパティに指定されているコードベース URL パスからクラスをロードします。

このメソッドは loadClass(String,String) に委譲されます。1 つ目の引数には null が、2 つ目の引数には name が渡されます。

パラメータ:
name - ロード対象クラスの名前
戻り値:
ロードされたクラスを表す Class オブジェクト
例外:
MalformedURLException - システムプロパティ java.rmi.server.codebase に、無効な 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 (codebase が null の場合は null) で URL.toString() を呼び出した結果が最初の引数として、name が 2 つ目の引数として、および null が 3 つ目の引数として渡されます。

パラメータ:
codebase - クラスのロード元の URL、または null
name - ロード対象クラスの名前
戻り値:
ロードされたクラスを表す Class オブジェクト
例外:
MalformedURLException - codebasenull で、システムプロパティ java.rmi.server.codebase に無効な URL が指定されている場合
ClassNotFoundException - クラスの定義が指定された URL になかった場合

loadClass

public static Class loadClass(String codebase,
                              String name)
                       throws MalformedURLException,
                              ClassNotFoundException
コードベース URL パスからクラスをロードします。codebasenull の場合は、システムプロパティ java.rmi.server.codebase の値が URL パスとして使用されます。

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

パラメータ:
codebase - クラスのロード元の URL のリスト (区切り文字はスペース)、または null
name - ロード対象クラスの名前
戻り値:
ロードされたクラスを表す Class オブジェクト
例外:
MalformedURLException - codebasenull ではなく、無効な URL が含まれる場合。または codebasenull で、システムプロパティ java.rmi.server.codebase に無効な URL が含まれる場合
ClassNotFoundException - クラスの定義が指定された場所になかった場合
導入されたバージョン:
1.2

loadClass

public static Class loadClass(String codebase,
                              String name,
                              ClassLoader defaultLoader)
                       throws MalformedURLException,
                              ClassNotFoundException
コードベース URL パスからクラスをロードします。指定したローダを使用することもできます。codebasenull の場合は、システムプロパティ java.rmi.server.codebase の値が URL パスとして使用されます。このメソッドは、プロバイダの実装の呼び出し側が、呼び出し側にスタックされているローダなど、状況に応じてクラスローダを選択できるようにするときに使用します。プロバイダの実装は通常、defaultLoader (指定されている場合) を使用して指定されたクラスを解決してから、コードベース URL パスのクラスを解決しようとします。

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

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

loadProxyClass

public static Class loadProxyClass(String codebase,
                                   String[] interfaces,
                                   ClassLoader defaultLoader)
                            throws ClassNotFoundException,
                                   MalformedURLException
指定された名前のインタフェースをコードベース URL パスから実装する動的プロキシクラス (Proxy を参照) をロードします。codebasenull の場合、システムプロパティ java.rmi.server.codebase の値が 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 で、システムプロパティ java.rmi.server.codebase に無効な 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 で、システムプロパティ java.rmi.server.codebase に無効な URL が含まれる場合
SecurityException - セキュリティマネージャが存在するときに、その checkPermission メソッドが失敗した場合。または、呼び出し側がコードベース URL パス内のすべての URL に対するアクセス権を持っていない場合
導入されたバージョン:
1.3

getClassAnnotation

public static String getClassAnnotation(Class cl)
クラス定義の位置を示す注釈文字列を返します。RMI はこれを使用して、指定されたクラスのオブジェクトの整列化を行う際に、クラス記述子に注釈を加えます。

このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.getClassAnnotation(Class) メソッドに委譲され、このとき cl が引数として渡されます。

パラメータ:
cl - 注釈を取得する対象のクラス
戻り値:
整列化時に指定されたクラスに注釈を加えるために使用される文字列、または null
導入されたバージョン:
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 のリスト) を指定して次に説明するメソッド実装を呼び出すと、関連付けられた「コードベースローダ」と現在のスレッドのコンテキストクラスローダ (Thread.getContextClassLoader() を参照) が返されます。コードベースローダは、codebase 引数によって識別されます。セキュリティマネージャが存在する場合、このプロバイダにはクラスローダのインスタンス (URLClassLoader のインスタンスなど) の内部テーブルが関連付けられます。このテーブルのキーは、親のクラスローダとコードベース URL パス (URL 順のリスト) のペアです。指定されたコードベース URL パスが指定されたコンテキストに codebase 引数として渡され、次のいずれかのメソッドが呼び出されると、このテーブル内の指定されたコードベース URL パスを持つコードベースローダと、現在のスレッドのコンテキストクラスローダがその親として返されます。条件を満たすローダがない場合は、ローダが新しく作成され、テーブルに追加されます。このテーブルに含まれるローダには、強参照は保持されません。このため、到達不可能なローダとそのローダに定義されているクラスはガベージコレクトされます。セキュリティマネージャが存在しないときに信頼されないコードが仮想マシンに暗黙的にロードされないようにするために、セキュリティマネージャが設定されていない場合は、コードベースローダは現在のスレッドのコンテキストクラスローダになります (指定されたコードベース URL パスは無視され、リモートクラスをロードできなくなります)。

getClassLoader メソッドは、指定されたコードベース URL パスのコードベースローダを返します。セキュリティマネージャが存在する場合、呼び出し側コンテキストにコードベース URL パス内のすべての URL に対するアクセス権がないときは、SecurityException がスローされます。

loadClass メソッドは、指定された名前のクラスを次の方法でロードしようとします。

defaultLoader 引数が null でない場合は、まず defaultLoader を使用して、指定された name のクラスをロードしようとします。たとえば、次のように評価します。
     Class.forName(name, false, defaultLoader)
 
クラスを defaultLoader からロードできた場合、そのクラスが返されます。ClassNotFoundException 以外の例外がスローされた場合は、その例外が呼び出し側にスローされます。

次に、loadClass メソッドが、指定されたコードベース URL パスのコードベースローダを使用して、指定された name のクラスをロードしようとします。codebase の文字列に複数の URL を指定するときは、スペースで区切ってください。セキュリティマネージャが存在する場合、呼び出し側コンテキストにはコードベース 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

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

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

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

JavaTM 2
Platform
Std. Ed. v1.4.0

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

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.