2009-03-31 10 views
1

動的プロキシスタブ実装が実際にシーンの後ろでどのように行われているかを理解したいと思います。私が読んだことによると、事前生成されたスタブクラスが見つからない場合にリモートオブジェクトがエクスポートされるまでに、RMIランタイムはスタブとして動作する動的プロキシを生成します。そのスタブはRMIレジストリにバインドされ、後で一部のRMIクライアントからアクセスできます。RMIの動的プロキシスタブ実装

スタブは実際には動的に生成されたプロキシなので、そのクラス定義はクライアント側では使用できないため、クライアントはRMIレジストリからスタブを引き続き取得できますか?シーンの背後で何らかの動的なクラスローディングが起こっているのですか、またはRMIはこれを回避するために別の手法を使用していますか?

答えて

2

Java.lang.reflect.Proxyはシリアライズ可能で、ObjectOutputStreamとObjectInputStreamに特別なサポートがあります。基本的に実装されたインタフェースと呼び出しハンドラは直列化され、逆シリアル化時には新しい動的プロキシが構築されます。

+0

すばらしい答え。素晴らしい。ありがとう、EJP。 –

-2

RMIは動的クラスローディングを使用します。クラスパスは、クライアントがクラスをロードする 'クラスパス注釈'としてコールとともに送信されます。詳細はRMI実装を参照してください.JDKソースの一部として利用できます。具体的には、ObjectOutputStreamクラスとRMIClassloaderクラスです。

更新:RMIはHTTPサーバーを起動しません。実際には、このためのカスタムソリューションが必要です。それらのうちの1つは、実行するHTTPサーバーであり、サーバーを通じてクラスを使用可能にし、スタブにHTTPサーバーのアドレス/ポートを持つコードベースを渡して、クライアントがダウンロードできるようにします。

+0

答えをありがとう。動的クラスロードはクラス定義要求を提供するためにHTTPサーバーのような場所を必要とするので、私はこれが実際にどのように行われるのか、まだ困惑しています。 RMIが内部的にそのようなサーバを起動して動的なプロキシクラスをホストしない限り。何か案が? –

+0

答えを更新しました。 – talonx

+0

これはかなり不正確です。ソースJVMで指定された* codebase *属性は、RMI MarshalOutputStreamによるマーシャリング中にシリアル化された*オブジェクト*とともに渡されます。これには、スタブだけでなく、マーシャリングされたすべてのオブジェクトにHTTPサーバーのhost:portが含まれています。 – EJP

関連する問題