目次|前|次 | Java Remote Method Invocation |
java.io.Serializable
インタフェースを実装した非リモート・オブジェクトが含まれます。クラスを直列化可能にする方法の詳細については、「Javaオブジェクト直列化仕様」を参照してください。ローカルでは入手できないパラメータまたは戻り値のクラスは、RMIシステムによって動的にダウンロードされます。RMIがパラメータ、戻り値、例外を読み取る際にパラメータおよび戻り値のクラスをダウンロードする方法の詳細については、「クラスの動的なロード」のセクションを参照してください。
したがって、リモート・メソッド呼出しで非リモート・オブジェクトが返されるとき、非リモート・オブジェクトの内容は、リモート・オブジェクトの呼出しが呼び出される前にコピーされます。
リモート・メソッド呼び出しから非リモート・オブジェクトが戻されるときは、呼出し側の仮想マシンに新規オブジェクトが作成されます。
java.io.ObjectOutputStream
クラスのサブクラスであるストリームに書き込まれます。ObjectOutputStream
サブクラスは、replaceObject
メソッドをオーバーライドして、エクスポートされた各リモート・オブジェクトを対応するスタブ・インスタンスで置き換えます。オブジェクトであるパラメータは、ObjectOutputStream
のwriteObject
メソッドを使ってストリームに書き込まれます。ObjectOutputStream
は、writeObject
メソッドによってストリームに書き込まれた各オブジェクト(書き込まれたオブジェクトによって参照されているオブジェクトも含む)の、replaceObject
メソッドを呼び出します。RMIのサブクラスObjectOutputStream
のreplaceObject
メソッドの戻り値は、次のとおりです。
replaceObject
に渡されたオブジェクトがjava.rmi.Remote
のインスタンスであり、そのオブジェクトがRMIランタイムにエクスポートされた場合、リモート・オブジェクトのスタブが返される。オブジェクトがjava.rmi.Remote
のインスタンスであり、そのオブジェクトがRMIランタイムにエクスポートされない場合、replaceObject
はオブジェクト自体を返す。リモート・オブジェクトのスタブは、java.rmi.server.RemoteObject.toStub
メソッドへの呼出しによって取得される。replaceObject
に渡されたオブジェクトがjava.rmi.Remote
のインスタンスでない場合は、単にそのオブジェクトが返される。ObjectOutputStream
もannotateClass
メソッドを実装し、クラスが呼出し側でダウンロードできるように呼出しストリームにクラスの場所についての注釈を付けます。annotateClass
の使用方法の詳細は、「クラスの動的なロード」のセクションを参照してください。
どのパラメータも同一のObjectOutputStream
に書き込まれるため、呼出し側で同じオブジェクトを参照している参照は、受信側でも同じオブジェクトのコピーを参照します。受信側では、パラメータは同一のObjectInputStream
によって読み取られます。
オブジェクトの書込み用のObjectOutputStream
(および読取り用のObjectInputStream
)のその他のデフォルトの動作は、パラメータの引き渡しで維持されます。たとえば、オブジェクトの書込み時のwriteReplace
の呼び出し、およびオブジェクトの読取り時のreadResolve
の呼出しは、RMIのパラメータ整列化および非整列化ストリームで優先されます。
戻り値(または例外)も上記のRMIでのパラメータの引き渡しと同じ方法でObjectOutputStream
サブクラスに書き込まれ、パラメータの転送と同じ方法で置き換えられます。