2011-12-14 6 views
3

リモート呼び出しのパラメータまたは戻り値の一部として、RMI(Sun VMでsun.rmiの実装)がオブジェクトをデシリアライズする場合、クラスの名前(シリアル化されたデータの文字列)からClassオブジェクトです。どのようにClassLoaderをクラスの定義に使用するかは、RMIがどのように決定しますか?どのように(実装レベルで)Java RMIはクラスをロード+定義しますか?

答えて

2

デフォルトでは、Javaデシリアライゼーションは、最初の非システムクラスのスタックを検索し、そのクラスローダー(つまり、最初の非ヌルクラスローダー)を使用します。 RMIは、注釈を直列ストリームに追加して、クラスをダウンロードする場所(URL)を指定します。デフォルトでは、RMIクラスローダはその場所を使用して追加のクラスを検索します。その動作をオフに切り替えるシステムプロパティがあります(悪い考えではありません)。

+0

基本的に、リモートコードベースが指定されていないと仮定すると、コールをスタブにしたClassをロードしたClassLoaderによって戻り値がロードされますか? (または、スタブがinstanceofである特定のProxyクラスを定義したClassLoader?) UnicastServerRefがエクスポートされたオブジェクトへの実際のアップコールを行うまで、パラメータはすべてデシリアライズされています。すべてのスタックフレームは、RMIのディスパッチスレッドの1つにあるため、システムクラスにする必要があります。右? – jon

+0

@jon私は、サーバーオブジェクトのクラスローダーか、エクスポートされたコンテキスト(通常は同じもの)を取得すると思います。 –

+0

それはどれも「デフォルトで」ありません。リモート・オブジェクトをエクスポートするJVMでjava.rmi.server.codebaseプロパティーを設定して、プロセス全体を開始する必要があります。私はあなたが参照している 'システムクラス'が何であるかわかりません。 RMIは 'デフォルトJava直列化'を使用せず、resolveClass()をオーバーライドする独自のレイヤーを追加します。 – EJP

関連する問題