目次 | 前へ | 次へ 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.