目次|| Java Remote Method Invocation


3.4クラスの動的なロード

RMIでは、直列化可能な任意のオブジェクトを、RMI呼出しに渡すパラメータ、戻り値、および例外とすることができます。また、オブジェクトの直列化メカニズムを使って、仮想マシン間でデータを転送したり、受信側でクラス定義ファイルをロードできるように、呼出しストリームに適切な場所情報を注釈として付ける処理を行います。

リモート・メソッド呼出しのためのパラメータおよび戻り値をライブ・オブジェクトにするために、受信側のJVMで非整列化するときは、ストリーム内に存在するオブジェクトのすべての型のクラス定義が必要になります。非整列化処理では、まず、ローカル・クラスのロード・コンテキスト(現在のスレッドのコンテキスト・クラス・ローダー)内の名前によってクラスの解決処理が試みられます。また、RMIでは、転送するエンド・ポイントで指定されたネットワークの場所から、リモート・メソッド呼出しのパラメータや戻り値として渡されるオブジェクトの実際の型のクラス定義を動的にロードする機能も提供されています。これには、特定のリモート・オブジェクトの実装クラスに対応するリモート・スタブ・クラス(リモート参照の格納に使用)の動的なダウンロードも含まれます。また、宣言されたパラメータの型のサブクラスなど、RMI呼出しで値によって渡される他の型のクラスのうち、非整列化する側のクラスのロード・コンテキストでまだ使用可能になっていないクラスを動的にダウンロードすることもできます。

クラスの動的なロードをサポートするために、RMIランタイムでは、RMIパラメータと戻り値の整列化および非整列化に使う整列化ストリームに、java.io.ObjectOutputStreamおよびjava.io.ObjectInputStreamの特別なサブクラスを使います。これらの各サブクラスによってObjectOutputStreamannotateClassメソッド、およびObjectInputStreamresolveClassメソッドがオーバーライドされ、ストリーム内のクラス記述子に対応するクラス定義を含むクラス・ファイルの場所についての情報が伝えられます。

RMI整列化ストリームに書き込まれたクラス記述子ごとに、そのクラス・オブジェクトのjava.rmi.server.RMIClassLoader.getClassAnnotationの呼出し結果がannotateClassメソッドによってストリームに追加されます。この結果は、nullか、Stringオブジェクトです。Stringオブジェクトは、リモート・エンドポイントがそのクラスのクラス定義ファイルをダウンロードする、元のコード・ベースURLパス(スペースで区切られたURLの一覧)を表します。

RMI整列化ストリームから読み取られたクラス記述子ごとに、resolveClassメソッドによって、ストリームからオブジェクトが1つ読み取られます。オブジェクトがStringの場合、およびjava.rmi.server.useCodebaseOnlyプロパティの値がtrueでない場合、resolveClassRMIClassLoader.loadClass呼出しの結果を返します。この呼出しの最初のパラメータは注釈の付けられたStringオブジェクトであり、2番目のパラメータはクラス記述子内の目的のクラス名です。これ以外の場合、resolveClassは、クラス名を唯一のパラメータとするRMIClassLoader.loadClass呼出しの結果を返します。

RMIでのクラスのロードの詳細については、「RMIClassLoaderクラス」のセクションを参照してください。



目次||
Copyright 1997, 2010, Oracle and/or its affiliates. All rights reserved.