目次|| Java Remote Method Invocation


2.6リモート・メソッド呼出しでのパラメータ引き渡し

リモート・オブジェクトへの引数、リモート・オブジェクトからの戻り値は、直列化可能なオブジェクトであればどれでも可能です。これにはプリミティブ型、リモート・オブジェクト、java.io.Serializableインタフェースを実装した非リモート・オブジェクトが含まれます。クラスを直列化可能にする方法の詳細については、「Javaオブジェクト直列化仕様」を参照してください。ローカルでは入手できないパラメータまたは戻り値のクラスは、RMIシステムによって動的にダウンロードされます。RMIがパラメータ、戻り値、例外を読み取る際にパラメータおよび戻り値のクラスをダウンロードする方法の詳細については、「クラスの動的なロード」のセクションを参照してください。


2.6.1非リモート・オブジェクトの引き渡し

リモート・メソッド呼出しのパラメータとして渡されたり、リモート・メソッド呼出しの結果として戻される非リモート・オブジェクトは、コピーにより渡されます。つまり、非リモート・オブジェクトは、Java SEプラットフォームのオブジェクト直列化メカニズムを使って直列化できます。

したがって、リモート・メソッド呼出しで非リモート・オブジェクトが返されるとき、非リモート・オブジェクトの内容は、リモート・オブジェクトの呼出しが呼び出される前にコピーされます。

リモート・メソッド呼び出しから非リモート・オブジェクトが戻されるときは、呼出し側の仮想マシンに新規オブジェクトが作成されます。


2.6.2リモート・オブジェクトの引き渡し

リモート・メソッド呼出しで、エクスポートされたリモート・オブジェクトをパラメータまたは戻り値として渡す場合には、そのリモート・オブジェクトのスタブが代わりに渡されます。エクスポートされていないリモート・オブジェクトは、スタブ・インスタンスに置き換えられません。パラメータとして渡されたリモート・オブジェクトは、リモート・インタフェースだけを実装できます。


2.6.3参照の整合性

単一のリモート・メソッド呼出しで、あるオブジェクトへの2つの参照が、あるJVMから別のJVMへパラメータ(または戻り値)として渡され、それらの参照が送信側のJVM上の同一オブジェクトを参照している場合、これらの参照は、受信側のJVM上のオブジェクトの1つのコピーも参照します。さらに一般的に説明すると、単一のリモート・メソッド呼出し内では、RMIシステムは、呼出し内でパラメータとして渡されたり、戻り値として返されるオブジェクト間の参照の整合性を維持します。


2.6.4クラスの注釈

リモート・メソッド呼出しで、あるJVMから別のJVMにオブジェクトを送信する際に、RMIシステムは呼出しストリーム内のクラス記述子にクラスの情報(URL)を注釈として付け、受信側でクラスをロードできるようにします。リモート・メソッド呼出し中には、必要に応じて随時、クラスをダウンロードする必要があります。


2.6.5パラメータの転送

リモート呼出し先に渡すパラメータを直列化するために、RMI呼出し内のパラメータは、java.io.ObjectOutputStreamクラスのサブクラスであるストリームに書き込まれます。ObjectOutputStreamサブクラスは、replaceObjectメソッドをオーバーライドして、エクスポートされた各リモート・オブジェクトを対応するスタブ・インスタンスで置き換えます。オブジェクトであるパラメータは、ObjectOutputStreamwriteObjectメソッドを使ってストリームに書き込まれます。ObjectOutputStreamは、writeObjectメソッドによってストリームに書き込まれた各オブジェクト(書き込まれたオブジェクトによって参照されているオブジェクトも含む)の、replaceObjectメソッドを呼び出します。RMIのサブクラスObjectOutputStreamreplaceObjectメソッドの戻り値は、次のとおりです。 RMIのサブクラスObjectOutputStreamannotateClassメソッドを実装し、クラスが呼出し側でダウンロードできるように呼出しストリームにクラスの場所についての注釈を付けます。annotateClassの使用方法の詳細は、「クラスの動的なロード」のセクションを参照してください。

どのパラメータも同一のObjectOutputStreamに書き込まれるため、呼出し側で同じオブジェクトを参照している参照は、受信側でも同じオブジェクトのコピーを参照します。受信側では、パラメータは同一のObjectInputStreamによって読み取られます。

オブジェクトの書込み用のObjectOutputStream (および読取り用のObjectInputStream)のその他のデフォルトの動作は、パラメータの引き渡しで維持されます。たとえば、オブジェクトの書込み時のwriteReplaceの呼び出し、およびオブジェクトの読取り時のreadResolveの呼出しは、RMIのパラメータ整列化および非整列化ストリームで優先されます。

戻り値(または例外)も上記のRMIでのパラメータの引き渡しと同じ方法でObjectOutputStreamサブクラスに書き込まれ、パラメータの転送と同じ方法で置き換えられます。



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