目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
RemoteStub
クラスjava.rmi.server.RemoteStub
クラスは、リモートオブジェクトのスタブで共通のスーパークラスです。スタブオブジェクトは代理であり、リモートオブジェクトの実際の実装が定義するのとまったく同じインタフェースのセットをサポートします。
package java.rmi.server; public abstract class RemoteStub extends java.rmi.RemoteObject { protected RemoteStub() {...} protected RemoteStub(RemoteRef ref) {...} protected static void setRef(RemoteStub stub, RemoteRef ref) {...} }
RemoteStub
の 1 つ目のコンストラクタは、リモート参照としてnull
をとるスタブを作成します。2 つ目のコンストラクタは、指定されたリモート参照 ref を引数にとるスタブを作成します。
setRef
メソッドは、Java 2 SDK, Standard Edition, v1.2 では推奨されていません (サポートもされません)。
クライアントは、リモートオブジェクトのクラスが定義するのと「厳密に」同じセットのリモートインタフェースを持ったスタブ (代理) オブジェクトと対話します。 スタブクラスには、オブジェクトの型グラフを構成するクラス階層の非リモート部分は含まれません。これは、スタブクラスは 1 つ以上のリモートインタフェースを実装するもっとも洗練された実装クラスから生成されるためです。たとえば、C が B を継承し、B が A を継承したとして、B だけがリモートインタフェースを実装する場合は、スタブが生成されるのは B からであり、C からではありません。スタブは、リモートオブジェクトクラスと同じリモートインタフェース群を実装するため、スタブはサーバオブジェクトの型のリモート部分と同じ型を持つことになります。このため、クライアントは、Java 言語の組み込み演算を利用してリモートオブジェクトの型チェックや、あるリモートインタフェースから別のインタフェースへのキャストを行うことができます。
final
宣言された Object メソッドのセマンティクス
以下のメソッドはjava.lang.Object
クラスでfinal
宣言されているため、どの実装によってもオーバーライドできません。
getClass
のデフォルト実装は、Java 言語で記述されたすべてのオブジェクト (ローカルとリモート両方) に適用可能です。 このため、リモートオブジェクトの場合でも、特別な実装は必要ありません。リモートスタブに使われた場合には、rmic
によって生成されたスタブオブジェクトの正確な型がgetClass
メソッドによってレポートされます。ただし、スタブの型はリモートオブジェクトにより実装されたリモートインタフェースだけを反映したもので、そのオブジェクトのローカルインタフェースを反映しないことに注意してください。
java.lang.Object
のwait
とnotify
メソッドは Java 言語のスレッドモデルに則して待機と通知を扱います。これらのメソッドをリモートスタブに対して使うことが Java のスレッドモデルに違反するわけではありませんが、これらのメソッドは、ローカルな Java オブジェクトを扱う場合とはセマンティクスが異なります。特に、これらのメソッドは、クライアントのリモートオブジェクト (スタブ) へのローカル参照に作用し、リモートにある実際のオブジェクトには作用しません。