目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
java.rmi.server.RMIClassLoader クラスは、RMI でネットワークベースのクラスのロードをサポートする、public かつ static のユーティリティメソッドのセットを提供します。これらのメソッドは、RMI 内部の整列化ストリームによって呼び出され、RMI パラメータおよび戻り値の型のクラスを動的にロードしますが、RMI でのクラスのロードの動作を真似るために、アプリケーションから直接呼び出されることもあります。RMIClassLoader クラスには、パブリックにアクセス可能なコンストラクタがないため、インスタンスを生成できません。
package java.rmi.server; public class RMIClassLoader { public static String getClassAnnotation(Class cl); public static Object getSecurityContext(ClassLoader loader); public static Class loadClass(String name) throws java.net.MalformedURLException, ClassNotFoundException; public static Class loadClass(String codebase, String name) throws java.net.MalformedURLException, ClassNotFoundException; public static Class loadClass(URL codebase, String name) throws java.net.MalformedURLException, ClassNotFoundException; }
getClassAnnotation
メソッドは、ネットワークのコードベースパスを表す String を返します。このコードベースパスは、指定されたクラスの定義をダウンロードするためにリモートエンドポイントが使用します。RMI ランタイムは、getClassAnnotation
メソッドから返された String オブジェクトを、整列化ストリーム内のクラス記述子の注釈として使います。このコードベース文字列の形式は、スペースで区切ったコードベース URL 文字列のパスです。提供されたクラスのクラスローダに応じて、次のようにコードベース文字列が返されます。
- クラスローダが以下のローダのどれかである場合は、java.rmi.server.codebase プロパティの値が返されるか、またはこのプロパティが設定されていない場合は null が返されます。
- 「システムクラスローダ」 (アプリケーションの「クラスパス」にクラスをロードするために使用され、
ClassLoader.getSystemClassLoader
メソッドから返されるクラスローダ)- インストール型拡張機能用のクラスローダなどの「システムクラスローダ」の親
- null (VM クラスのロード用の「ブートクラスローダ」)
- それ以外の場合で、クラスローダが java.net.URLClassLoader クラスのインスタンスである場合、返されるコードベース文字列は、クラスローダの
getURLs
メソッドを呼び出すことによって返される、外部形式のスペースで区切られた URL の一覧です。RMIClassLoader.loadClass
メソッドの 1 つを呼び出すサービスを提供するために、URLClassLoader が RMI ランタイムによって作成された場合は、関連付けられたコードベース文字列の取得にアクセス権は必要ありません。これが任意のURLClassLoader
のインスタンスである場合、呼び出し側は、getURLs
メソッドから返される各 URL のインスタンスであるopenConnection().getPermission()
を呼び出すことによって指定される、そのコードベースパス内のすべての URL に接続可能なアクセス権が必要です。- クラスローダが URLClassLoader のインスタンスでない場合は、java.rmi.server.codebase プロパティの値が返されるか、またはこのプロパティが設定されていない場合は、null が返されます。
getSecurityContext
メソッドは、JDK 1.1 でクラスローダベースのセキュリティチェックを実装するために内部で使用されていましたが、JDK 1.2 のセキュリティモデルには適用されなくなったため、現在では推奨されません。RMIClassLoader.loadClass
メソッドの 1 つを呼び出すサービスを提供するために、指定されたクラスローダが RMI ランタイムによって作成された場合は、クラスローダのコードパス内の最初の URL が返されます。それ以外の場合は、null が返されます。3 つの
loadClass
メソッドは、どれも現在のスレッドのコンテキストクラスローダを使って、指定された名前を持つクラスをロードしようとします。セキュリティマネージャのセットがある場合は、特定のコードベースパス (メソッドによって異なる) が使われます。
- クラス name というパラメータを 1 つだけとる
loadClass
メソッドは、java.rmi.server.codebase プロパティの値を、使用するコードベースパスとして暗黙に使います。この java.rmi.server.codebase プロパティの使用が推奨されないため、このバージョンのloadClass
メソッドの使用は推奨されません。次のより一般的なバージョンを使ってください。- String codebaseパラメータをとる
loadClass
メソッドは、そのパラメータをコードベースパスとして使います。コードベース文字列は、getClassAnnotation
メソッドにより返される文字列のように、スペースで区切られた URL リストである必要があります。- java.net.URL codebase パラメータをとる
loadClass
メソッドは、その単一の URL をコードベースとして使います。
どの loadClass メソッドについても、現在のスレッド上でgetContextClassLoader
を呼び出すことによって決定される現在のスレッドのコンテキストクラスローダとコードベースパスを使って、クラスのロード元とする内部クラスローダのインスタンスが決定されます。RMI ランタイムは、親クラスローダとローダのコードベースパス (順序付けられた URL リスト) で構成されるペアがキーとなる内部クラスローダのインスタンスのテーブルを保持します。loadClass
メソッドは、目的のコードベースパスと、現在のスレッドのコンテキストクラスローダを親として持つ URLClassLoader のインスタンスを検索します。そのようなローダが存在しない場合は、作成されてテーブルに追加されます。最後に、指定されたクラス名を使って、選択されたクラスローダ上でloadClass
メソッドが呼び出されます。セキュリティマネージャのセットがある (
System.getSecurityManager
が null を返さない) 場合は、loadClass
の呼び出し側に、コードベースパス内のすべての URL に接続可能なアクセス権が必要です。そのようなアクセス権がない場合は、ClassNotFoundException がスローされます。セキュリティマネージャがない Java VM に信頼のおけない任意のコードがロードされることを防ぐため、セキュリティマネージャのセットがない場合は、どのloadClass
メソッドも特定のコードベースパスを無視し、現在のスレッドのコンテキストクラスローダから指定された「名前」を持つクラスだけをロードしようとします。