目次|前|次 | Java Remote Method Invocation |
JDK 1.1のスタブ・プロトコルでは、Operationはrmicが割り当てたメソッド番号を表し、Hashはスタブのインタフェース・ハッシュであるスタブおよびスケルトンのハッシュを表しています。Java 2のスタブ・プロトコル(Java 2のスタブはrmic
で-v1.2
オプションを使用して生成される)では、Operationは -1という値を持ち、Hashは呼び出されるメソッドを表すハッシュになります。ハッシュについては、「RemoteRef
インタフェース」のセクションで説明されています。
RMI呼出しのReturnValueは、正常か例外かを示すリターン・コード、戻り値にタグ付けするUniqueIdentifier (必要ならばDGCAck
を送るために使用する)、そして返される結果である、戻り値ValueまたはスローされたExceptionが続く構成になっています。
ObjectOutputStream
のannotateClass
メソッドおよびObjectInputStream
のresolveClass
メソッドをそれぞれオーバーライドします。各クラスには、コード・ベースのURL (クラスをロードする元の場所)を使用して注釈が付けられています。annotateClass
メソッドでは、クラスをロードしたクラス・ローダーに対し、そのクラス・ローダーのコード・ベースのURLを問い合わせます。クラス・ローダーが非null
で、非null
コード・ベースを持っている場合は、そのコード・ベースは、ObjectOutputStream.writeObject
メソッドを使用してストリームに書き込まれます。それ以外の場合は、writeObject
メソッドを使用して、ストリームにnull
が書き込まれます。注意: 最適化のため、「java
」パッケージ内のクラスには、注釈が付けられません。これは、これらのクラスは受信側が常に利用できるからです。
クラスの注釈は、直列化復元中にObjectInputStream.resolveClass
メソッドを使用して解決されます。resolveClass
メソッドは、最初にObjectInputStream.readObject
メソッドを使用して、注釈を読み取ります。注釈(コード・ベースURL)がnull
でない場合は、そのURLのクラス・ローダーを取得して、クラスをロードしようとします。クラスは、クラス・バイトを取り出すためにjava.net.URLConnection
を使用してロードされます。これは、Webブラウザのアプレット・クラス・ローダーが使用するメカニズムと同じです。