目次 | 前の項 目 | 次の項目 | Java Remote Method Invocation |
RMI では、直列化可能な任意のオブジェクトを、RMI 呼び出しに渡すパラメータ、戻り値、および例外とすることができます。また、オブジェクトの直列化機構を使って、仮想マシン間でデータを転送したり、受信 側でクラス定義ファイルをロードできるように、呼び出しストリームに適切な場所情報を注釈として付ける処理を行います。リモートメソッド呼び出しのためのパラメータおよび戻り値をライブオブジェクトにするために、受信側の JVM で非整列化する際、ストリーム内に存在するオブジェクトのすべての型のクラス定義が必要になります。非整列化処理では、まず、ローカルクラスのローディン グコンテキスト (現在のスレッドのコンテキストクラスローダ) 内の名前によってクラスの解釈処理が試みられます。また、RMI では、転送するエンドポイントで指定されたネットワークの場所から、リモートメソッド呼び出しのパラメータや戻り値として渡されるオブジェクトの実際の型 のクラス定義を動的にロードする機能も提供されています。これには、特定のリモートオブジェクトの実装クラスに対応するリモートスタブクラス (リモート参照の格納に使用) の動的なダウンロードも含まれます。 また、宣言されたパラメータの型のサブクラスなど、RMI 呼び出しで値によって渡される他の型のクラスのうち、非整列化する側のクラスのローディングコンテキストでまだ使用可能になっていないクラスを動的にダウ ンロードすることもできます。
クラスの動的なロードをサポートするために、RMI ランタイムでは、RMI パラメータと戻り値の整列化および非整列化に使う整列化ストリームに、
java.io.ObjectOutputStream
およびjava.io.ObjectInputStream
の特別なサブクラスを使います。これらの各サブクラスによってObjectOutputStream
のannotateClass
メソッド、およびObjectInputStream
のresolveClass
メソッドがオーバーライドされ、ストリーム内のクラス記述子に対応するクラス定義を含むクラスファイルの場所についての情報が伝えられます。RMI 整列化ストリームに書き込まれたクラス記述子ごとに、そのクラスオブジェクトの
java.rmi.server.RMIClassLoader.getClassAnnotation
の呼び出し結果が、annotateClass
メソッドによって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 クラス」を参照してください。