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