目次|前|次 | 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クラス」のセクションを参照してください。