| 目次|前|次 | 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サブクラスに書き込まれ、パラメータの転送と同じ方法で置き換えられます。