目次 | 前へ | 次へ | Java Remote Method Invocation |
リモートメソッド呼び出しのためのパラメータおよび戻り値をライブオブジェクトにするために、受信側の JVM で非整列化する際、ストリーム内に存在するオブジェクトのすべての型のクラス定義が必要になります。非整列化処理では、まず、ローカルクラスのローディングコンテキスト (現在のスレッドのコンテキストクラスローダ) 内の名前によってクラスの解釈処理が試みられます。また、RMI では、転送するエンドポイントで指定されたネットワークの場所から、リモートメソッド呼び出しのパラメータや戻り値として渡されるオブジェクトの実際の型のクラス定義を動的にロードする機能も提供されています。これには、特定のリモートオブジェクトの実装クラスに対応するリモートスタブクラス (リモート参照の格納に使用) の動的なダウンロードも含まれます。また、宣言されたパラメータの型のサブクラスなど、RMI 呼び出しで値によって渡されるほかの型のクラスのうち、非整列化する側のクラスのローディングコンテキストでまだ使用可能になっていないクラスを動的にダウンロードすることもできます。
クラスの動的なロードをサポートするために、RMI ランタイムでは、RMI パラメータと戻り値の整列化および非整列化に使う整列化ストリームに、java.io.ObjectOutputStream
および java.io.ObjectInputStream
の特別なサブクラスを使います。これらの各サブクラスによって ObjectOutputStream
の annotateClass
メソッド、および ObjectInputStream
の resolveClass
メソッドがオーバーライドされ、ストリーム内のクラス記述子に対応するクラス定義を含むクラスファイルの場所についての情報が伝えられます。
RMI 整列化ストリームに書き込まれたクラス記述子ごとに、そのクラスオブジェクトの java.rmi.server.RMIClassLoader.getClassAnnotation
の呼び出し結果が annotateClass
メソッドによってストリームに追加されます。この結果は、null
か、String
オブジェクトです。String オブジェクトは、リモートエンドポイントがそのクラスのクラス定義ファイルをダウンロードする、元のコードベース URL パス (スペースで区切られた URL の一覧) を表します。
RMI 整列化ストリームから読み取られたクラス記述子ごとに、resolveClass
メソッドによって、ストリームからオブジェクトが 1 つ読み取られます。オブジェクトが String の場合、および java.rmi.server.useCodebaseOnly
プロパティーの値が true
でない場合、resolveClass
は RMIClassLoader.loadClass
呼び出しの結果を返します。この呼び出しの最初のパラメータは注釈の付けられた String
オブジェクトで、2 番目のパラメータはクラス記述子内の目的のクラス名です。これ以外の場合、resolveClass
は、クラス名を唯一のパラメータとする RMIClassLoader.loadClass
呼び出しの結果を返します。
RMI でのクラスのロードの詳細については、「RMIClassLoader クラス」のセクションを参照してください。