目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
java.rmi.server.RemoteObject クラスは、リモートオブジェクトのために java.lang.Object の動作を実装します。hashCode
とequals
メソッドの実装により、リモートオブジェクト参照をハッシュテーブルに保存して比較できるようになります。equals
メソッドは、2 つのRemote
オブジェクトが同一のリモートオブジェクトを参照している場合に、true を返します。このメソッドは、2 つのリモートオブジェクトの参照同士を比較します。
toString
メソッドは、リモートオブジェクトについて説明した文字列を返します。この文字列の内容と構文は、実装に固有のものであり、変更されることもあります。java.lang.Object のほかのメソッドはすべてオリジナルの実装のままです。
package java.rmi.server; public abstract class RemoteObject implements java.rmi.Remote, java.io.Serializable { protected transient RemoteRef ref; protected RemoteObject(); protected RemoteObject(RemoteRef ref); public RemoteRef getRef(); public static Remote toStub(java.rmi.Remote obj) throws java.rmi.NoSuchObjectException; public int hashCode(); public boolean equals(Object obj); public String toString(); }
RemoteObject クラスは抽象クラスなので、インスタンスを生成できません。このため、サブクラス実装から RemoteObject のコンストラクタの 1 つを呼び出す必要があります。1 番目の RemoteObject コンストラクタは、null リモート参照を使って RemoteObject を作成します。2 番目の RemoteObject コンストラクタは、与えられたリモート参照 ref を使って RemoteObject を作成します。
getRef
メソッドは、リモートオブジェクトに対するリモート参照を返します。
toStub
メソッドは、パラメータとして渡されたリモートオブジェクト obj に対するスタブを返します。この操作は、事前にリモートオブジェクトの実装がエクスポートされている場合にだけ有効です。リモートオブジェクトに対するスタブが見つからなかった場合は、メソッドは、NoSuchObjectException をスローします。
java.lang.Object クラス内のequals
メソッド、hashCode
メソッド、およびtoString
メソッドの実装は、リモートオブジェクトには適切ではありません。このため、RemoteObject クラスが、よりリモートオブジェクトに適したセマンティクスを持つメソッド実装を提供します。
リモートオブジェクトをハッシュテーブル内でキーとして使用するためには、equals
メソッドおよびhashCode
メソッドをリモートオブジェクト実装内でオーバーライドする必要があります。これらのメソッドは、java.rmi.server.RemoteObject クラスによってオーバーライドされます。
- java.rmi.server.RemoteObject クラスの
equals
メソッドの実装は、2 つのオブジェクトの内容が同じであるかではなく、2 つのオブジェクト参照が同じであるかどうかを決定する。これは、内容の同一性を決定するにはリモートオブジェクト呼び出しが必要で、equals
のシグニチャーは、リモートの例外のスローを許可していないためである- java.rmi.server.RemoteObject クラスの
hashCode
メソッドの実装は、背後の同じリモートオブジェクトを参照するリモート参照のすべてに対して同じ値を返す。これは、同じオブジェクトへの参照は、同一とみなされるためである
toString
メソッドは、オブジェクトのリモート参照を表す文字列を返すように定義されています。文字列の内容は、リモート参照の型によって異なります。単一 (ユニキャスト) オブジェクトのための現在の実装には、オブジェクトの識別子とトランスポート層固有のオブジェクトについてのその他の情報 (ホスト名、ポート番号など) が含まれます。
オブジェクトの複製は、オブジェクトが java.lang.Cloneable インタフェースをサポートしている場合に、Java 言語のデフォルトの機構を使うことによってだけ可能になります。rmic コンパイラによって生成されたリモートオブジェクトのスタブは、final 宣言されているため、Cloneable
インタフェースを実装していません。このため、スタブの複製はできません。
RemoteObject クラスは、java.io.ObjectOutputStream へのデータの直列化を処理するためにオブジェクトの直列化機構によって呼び出される、特別 (private) なwriteObject
メソッドおよびreadObject
メソッドを実装します。RemoteObject の直列化された形式は、次のメソッドを使って書き込まれます。
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException, java.lang.ClassNotFoundException;
直列化復元中に ObjectInputStream によって呼び出される次のメソッドを使って、RemoteObject の状態が、直列化された形式から構築し直されます。
private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException;
- まず、UTF 文字列である ref のクラス名がストリーム in から読み取られる。クラス名が空の文字列の場合、
- ストリームからオブジェクトが読み取られ、ref は、in.readObject への呼び出しによってそのオブジェクトに初期化される
- クラス名が空の文字列でない場合、
- 文字列 java.rmi.server.RemoteRef.packagePrefix の後に「.」およびストリームから読み取られたクラス名を続けることで、ref の完全なクラス名が生成される
- 完全なクラス名から、ref のクラスのインスタンスが生成される
- 新しいインスタンス (ref フィールドになる) が、ストリーム in からそのインスタンスの外部形式を読み取る
目次 | 前の項目 | 次の項目
Copyright © 1997-1998 Sun Microsystems, Inc. All Rights Reserved.