モジュール java.rmi
パッケージ java.rmi.server

クラスUnicastRemoteObject

java.lang.Object
java.rmi.server.RemoteObject
java.rmi.server.RemoteServer
java.rmi.server.UnicastRemoteObject
すべての実装されたインタフェース:
Serializable, Remote

public class UnicastRemoteObject extends RemoteServer
リモート・オブジェクトをJRMPを使ってエクスポートし、リモート・オブジェクトと通信するスタブを取得するために使用されます。 スタブは、実行時に動的プロキシ・オブジェクトを使用して生成されます。

非推奨: 静的スタブ。 静的に生成されたスタブのサポートは非推奨です。 これには、静的スタブを使用する必要があるこのクラス内のAPI、および静的スタブのロードに対する実行時サポートが含まれます。 次に示すように、オブジェクトをエクスポートする非優先の方法のいずれかを使用して、スタブを動的に生成することをお薦めします。

リモート・オブジェクトをエクスポートするには、8つの方法があります:

  1. UnicastRemoteObjectのサブクラス化およびUnicastRemoteObject()コンストラクタの呼出し。
  2. UnicastRemoteObjectのサブクラス化およびUnicastRemoteObject(port)コンストラクタの呼出し。
  3. UnicastRemoteObjectのサブクラス化およびUnicastRemoteObject(port, csf, ssf)コンストラクタの呼出し。
  4. exportObject(Remote)メソッドの呼出し。 非推奨。
  5. exportObject(Remote, port)メソッドの呼出し。
  6. exportObject(Remote, port, csf, ssf)メソッドの呼出し。
  7. exportObject(Remote, port, filter)メソッドの呼出し。
  8. exportObject(Remote, port, csf, ssf, filter)メソッドの呼出し。

4番目の手法であるexportObject(Remote)は、静的に生成されたスタブを常に使用するため、非推奨です。

他の手法はすべて次のアプローチを使用: java.rmi.server.ignoreStubClassesプロパティがtrue (大文字小文字を区別しません)の場合、または静的スタブが見つからない場合、スタブはProxyオブジェクトを使用して動的に生成されます。 それ以外の場合は、静的スタブが使用されます。

java.rmi.server.ignoreStubClassesプロパティのデフォルト値はfalseです。

静的に生成されたスタブは、通常、リモート・オブジェクト・クラスから事前生成されます。 次に説明するように、静的スタブがロードされ、そのスタブ・クラスのインスタンスが構築されます。

  • 「ルート・クラス」が次のようにして決定されます。リモート・オブジェクトのクラスがRemoteを拡張したインタフェースを直接実装している場合、そのリモート・オブジェクトのクラスがルート・クラスになります。それ以外の場合、リモート・オブジェクトのクラスのスーパー・クラスのうち、Remoteを拡張したインタフェースを直接実装している最上位のクラスが、ルート・クラスになります。
  • ロードするスタブ・クラスの名前を決定するために、ルート・クラスのバイナリ名と接尾辞_Stubが連結されます。
  • 指定した名前のスタブ・クラスがルート・クラスのクラス・ローダーを使ってロードされます。 スタブ・クラスはpublicである必要があり、RemoteStubを拡張する必要があり、少なくともjava.rmiモジュールにエクスポートされるパッケージ内に存在し、RemoteRef型の1つのパラメータを持つpublicコンストラクタが必要です。
  • 最後に、スタブ・クラスのインスタンスがRemoteRefを使って構築されます。
  • 適切なスタブ・クラスが見つからなかった場合、スタブ・クラスをロードできなかった場合、あるいはスタブ・インスタンスの作成時に問題が発生した場合は、StubNotFoundExceptionがスローされます。

スタブは、次の特性を持つProxyのインスタンスを構築することによって動的に生成されます。

  • プロキシのクラスは、リモート・オブジェクトのクラスのクラス・ローダーを使用して、Proxyクラスの仕様に従って定義されます。
  • プロキシは、リモート・オブジェクトのクラスが実装しているリモート・インタフェースのすべてを実装する
  • 各リモート・インタフェースは、パブリックで、少なくともjava.rmiモジュールのexportedであるパッケージ内に存在するか、少なくともjava.rmiモジュールのopenであるパッケージ内に存在する必要があります。
  • プロキシの呼出しハンドラは、RemoteRefを使って構築されたRemoteObjectInvocationHandlerインスタンスになる。
  • プロキシを作成できなかった場合は、StubNotFoundExceptionがスローされる。

エクスポートされたリモート・オブジェクトは、RMI仕様の説明に従ってスタブからメソッド呼出しを受け取ります。 各呼出しの操作およびパラメータは、カスタムのObjectInputStreamを使用して非整列化されます。 オブジェクトのエクスポート時にObjectInputFilterが指定され、nullではない場合、ストリームからアンマーシャリングされるため、パラメータをフィルタするために使用されます。 フィルタは、呼び出されるメソッドやパラメータ値に関係なく、すべての呼出しおよびすべてのパラメータに使用されます。 フィルタが指定されていない場合、またはエクスポートされたオブジェクトに対してnullの場合は、ObjectInputStreamデフォルト・フィルタ(ある場合)が使用されます。 デフォルトのフィルタはObjectInputFilter.Config.setSerialFilterで構成されています。 フィルタがいずれかのパラメータを拒否すると、ObjectInputStreamによってスローされたInvalidClassExceptionUnmarshalExceptionの原因として報告されます。

実装上のノート:
オブジェクトのエクスポートに使用されるコンストラクタまたは静的メソッドに応じて、ソケットの作成にRMISocketFactoryが使用される場合があります。 デフォルトでは、RMISocketFactoryによって作成されるサーバー・ソケットはすべてのネットワーク・インタフェースで待機します。 RMISocketFactoryクラスおよび『Java RMIの仕様』のセクション「RMIソケット・ファクトリ」を参照してください。
導入されたバージョン:
1.1
関連項目: