| 目次 | 前へ | 次へ | 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 ブラウザのアプレットクラスローダが使うメカニズムと同じです。