RMIClassLoader
は、RMIを使用して動的にクラスをロードするためのstaticメソッドから構成されます。 このクラス・ローダーには、ネットワークの場所(1つ以上のURL)からクラスをロードするメソッドや、既存のクラスが格納されている場所を取得するメソッドが組み込まれています。 これらのメソッドは、リモート・メソッド呼出しの引数や戻り値に含まれるクラスを整列化および非整列化するときに、RMIランタイムによって使用されます。また、これらのメソッドをアプリケーションから直接呼び出して、クラスを動的にロードすることもできます。
次のstaticメソッドの実装は、
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
に割り当てられ、パブリック引数なしコンストラクタを持つと、そのコンストラクタが起動されてプロバイダ・インスタンスが作成されます。 このシステム・プロパティが定義されている場合でも、これらの条件が満たされていない場合は、RMIClassLoader
の使用を試みるコードに対して、プロバイダ・インスタンスの取得に失敗したことを示す、特定できないError
がスローされます。 META-INF/services/java.rmi.server.RMIClassLoaderSpi
というリソースがシステム・クラス・ローダーから見える場合、そのリソースの内容はプロバイダ構成ファイルとして解釈され、そのファイルの最初に指定されているクラス名がプロバイダ・クラス名として使用されます。 システム・クラス・ローダーがその名前を持つクラスをロードでき、そのクラスをRMIClassLoaderSpi
に割り当てることができ、引数のないpublicコンストラクタを持つ場合は、プロバイダ・インスタンス作成時にそのコンストラクタが呼び出されます。 そのリソースが見つかっても、記述されているようにプロバイダをインスタンス化できない場合は、RMIClassLoader
の使用を試みるコードに対して、プロバイダ・インスタンスの取得に失敗したことを示す、不明なError
がスローされます。- それ以外の場合は、
getDefaultProviderInstance()
メソッド呼出しの戻り値に指定されているプロバイダ・インスタンスが選択されます。
- 導入されたバージョン:
- 1.1
- 関連項目:
-
メソッドのサマリー
修飾子と型メソッド説明static String
getClassAnnotation
(Class<?> cl) クラス定義の位置を示す注釈文字列を返します。RMIはこれを使用して、指定されたクラスのオブジェクトの整列化を行う際に、クラス記述子に注釈を加えます。static ClassLoader
getClassLoader
(String codebase) 指定されたコード・ベースURLパスからクラスをロードするクラス・ローダーを返します。static RMIClassLoaderSpi
サービス・プロバイダ・インタフェースRMIClassLoaderSpi
のデフォルト・プロバイダの正規インスタンスを返します。static Object
getSecurityContext
(ClassLoader loader) 非推奨。代替はありません。static Class<?>
非推奨。loadClass(String,String)
メソッドに置き換えられていますstatic Class<?>
指定されたコード・ベースURLパスからクラスをロードします。static Class<?>
loadClass
(String codebase, String name, ClassLoader defaultLoader) 指定されたコード・ベースURLパスからクラスをロードします。指定されたローダーを使用することもできます。static Class<?>
指定されたコード・ベースURLからクラスをロードします。static Class<?>
loadProxyClass
(String codebase, String[] interfaces, ClassLoader defaultLoader) 指定された名前を持つインタフェース群を実装した動的プロキシ・クラス(Proxy
を参照)を、指定されたコード・ベースURLパスからロードします。
-
メソッドの詳細
-
loadClass
@Deprecated public static Class<?> loadClass(String name) throws MalformedURLException, ClassNotFoundException 非推奨。loadClass(String,String)
メソッドに置き換えられています指定されたname
を名前に持つクラスをロードします。このメソッドは
loadClass(String,String)
に処理を委譲します。このとき、null
が最初の引数として、name
が2つめの引数として渡されます。- パラメータ:
name
- ロード対象クラスの名前- 戻り値:
- ロードされたクラスを表す
Class
オブジェクト - 例外:
MalformedURLException
- クラスのロード時に使用されたプロバイダ固有のURLが無効である場合ClassNotFoundException
- クラスの定義がコード・ベースの場所になかった場合- 関連項目:
-
loadClass
public static Class<?> loadClass(URL codebase, String name) throws MalformedURLException, ClassNotFoundException 指定されたコード・ベースURLからクラスをロードします。codebase
がnull
の場合、このメソッドの動作は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
-codebase
がnull
で、かつクラスのロード時に使用されたプロバイダ固有の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
-codebase
がnull
以外でかつ無効なURLを含んでいる場合、またはcodebase
がnull
でかつクラスのロード時に使用されたプロバイダ固有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
-codebase
がnull
以外でかつ無効なURLを含んでいる場合、またはcodebase
がnull
でかつクラスのロード時に使用されたプロバイダ固有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
-codebase
がnull
以外でかつ無効なURLを含んでいる場合、またはcodebase
がnull
でかつクラスのロード時に使用されたプロバイダ固有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を含んでいる場合、またはcodebase
がnull
でかつクラス・ローダーの識別に使用されたプロバイダ固有URLが無効である場合SecurityException
- セキュリティ・マネージャが存在するときに、そのcheckPermission
メソッドが失敗した場合。または、呼出し側がコード・ベースURLパス内のすべてのURLに接続するアクセス権を持っていない場合- 導入されたバージョン:
- 1.3
-
getClassAnnotation
クラス定義の位置を示す注釈文字列を返します。RMIはこれを使用して、指定されたクラスのオブジェクトの整列化を行う際に、クラス記述子に注釈を加えます。このメソッドは、プロバイダ・インスタンスの
RMIClassLoaderSpi.getClassAnnotation(Class)
メソッドに処理を委譲します。このとき、cl
が引数として渡されます。- パラメータ:
cl
- 注釈を取得する対象のクラス- 戻り値:
- 整列化時に指定されたクラスに注釈を加えるために使用される文字列、または
null
- 例外:
NullPointerException
-cl
がnull
である場合- 導入されたバージョン:
- 1.2
-
getDefaultProviderInstance
public static RMIClassLoaderSpi getDefaultProviderInstance()サービス・プロバイダ・インタフェースRMIClassLoaderSpi
のデフォルト・プロバイダの正規インスタンスを返します。 システム・プロパティjava.rmi.server.RMIClassLoaderSpi
が定義されていない場合、次に示すRMIClassLoader
のstaticメソッドは、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
のインスタンスの場合、そのローダーの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プラットフォームv1.2以降のRMIでは、クラス・ローダーのセキュリティ・コンテキストを取得するためにこのメソッドを使用しません。指定されたクラス・ローダーのセキュリティ・コンテキストを返します。- パラメータ:
loader
- セキュリティ・コンテキストの取得元のクラス・ローダー- 戻り値:
- セキュリティ・コンテキスト
- 関連項目:
-