| 目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
RemoteObject クラス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をスローします。
RemoteObject クラスによってオーバーライドされるオブジェクトのメソッド
java.lang.Objectクラス内のequals、hashCode、およびtoStringメソッドのデフォルトでの実装は、リモートオブジェクトには適切ではありません。このため、RemoteObjectクラスが、よりリモートオブジェクトに適したセマンティクスを持つメソッド実装を提供します。
equals メソッドおよび hashCode メソッド
リモートオブジェクトをハッシュテーブル内でキーとして使用するためには、equalsメソッドおよびhashCodeメソッドをリモートオブジェクト実装内でオーバーライドする必要があります。これらのメソッドは、java.rmi.server.RemoteObjectクラスによってオーバーライドされます。
java.rmi.server.RemoteObjectクラスのequalsメソッドの実装は、2 つのオブジェクトの内容が同じであるかではなく、2 つのオブジェクト参照が同じであるかどうかを決定する。これは、内容の同一性を決定するにはリモートオブジェクト呼び出しが必要で、equalsのシグニチャーは、リモートの例外のスローを許可していないためであるjava.rmi.server.RemoteObjectクラスのhashCodeメソッドの実装は、同じ基本のリモートオブジェクトを参照するリモート参照のすべてに対して同じ値を返す。 これは、同じオブジェクトへの参照は、同一とみなされるためである
toString メソッド
toStringメソッドは、オブジェクトのリモート参照を表す文字列を返すように定義されています。文字列の内容は、リモート参照の型によって異なります。単一 (ユニキャスト) オブジェクトのための現在の実装には、オブジェクトの識別子とトランスポート層固有のオブジェクトについてのその他の情報 (ホスト名、ポート番号など) が含まれます。
clone メソッド
オブジェクトの複製は、オブジェクトがjava.lang.Cloneableインタフェースをサポートしている場合に、Java 言語のデフォルトの機構を使うことによってのみ可能になります。rmicコンパイラによって生成されたリモートオブジェクトのスタブは、final 宣言されているため、Cloneableインタフェースを実装していません。このため、スタブの複製はできません。
RemoteObjectクラスは、java.io.ObjectOutputStreamへのデータの直列化を処理するためにオブジェクトの直列化機構によって呼び出される、特別な (専用の)writeObjectメソッドおよびreadObjectメソッドを実装します。
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException, java.lang.ClassNotFoundException;
RemoteObjectのリモート参照フィールド ref がnullの場合、このメソッドはjava.rmi.MarshalExceptionをスローする- リモート参照 ref が
nullでない場合、ref のクラスは、getRefClassメソッドの呼び出しによって取得される。 通常、このメソッドはリモート参照のクラスのパッケージ修飾されていない名前を返す。直列化復元中に
ObjectInputStreamによって呼び出される次のメソッドを使って、RemoteObjectの状態が、直列化された形式から再構築されます。
private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException;
- まず、UTF 文字列である ref のクラス名がストリーム in から読み取られる。
- 修飾されていないクラス名がストリームから読み取られた場合、
- 文字列
java.rmi.server.RemoteRef.packagePrefixのあとに「.」およびストリームから読み取られたクラス名を続けることで、ref の完全なクラス名が生成される- 完全なクラス名から、ref のクラスのインスタンスが生成される。
InstantiationExceptionまたはIllegalAccessExceptionが発生したためにインスタンスが作成されない場合は、java.rmi.UnmarshalExceptionがスローされる- 新しいインスタンス (ref フィールドになる) が、ストリーム in からそのインスタンスの外部形式を読み取る
目次 | 前の項目 | 次の項目
Copyright © 1997-1999 Sun Microsystems, Inc. All Rights Reserved.