5

私は現在RMIについて学んでいます。

私はコードベースの概念を本当に理解していません。私が読んだすべての論文は、Remoteオブジェクトを呼び出すクライアントがコードベースからメソッド定義をロードできることを示唆しています。問題は今です:とにかくクラスパスに説明/インターフェースは必要ありませんか?ランタイム中にのみメソッドを知っている場合、リモートオブジェクトのメソッドを呼び出すにはどうすればよいですか?これはコンパイルすらしません。

私はここで完全にポイントを逃していますか?では、コードベースのポイントは正確には何ですか?コードベースを提供するには、多くの余分な作業と要件があるようです。

ありがとう

4

1 に答える 1

7

たとえば、クライアントにインターフェイスのみを提供し、実装が特定のコードベースに配置されるとします。次に、クライアントはサーバーに特定のオブジェクトを送信するように要求します。クライアントは特定のインターフェイスを実装するオブジェクトを受信することを期待しますが、実際の実装はクライアントには不明です。送信されたオブジェクトを逆シリアル化するときは、コードに移動する必要があります。渡される実際のオブジェクトに対応する実装クラスをベースにしてダウンロードします。

これにより、クライアントが非常に薄くなり、すべてのクライアントを更新することなく、コードベースのクラスを非常に簡単に更新できます。

編集

次のインターフェイスを備えたRMIサーバーがあるとします。

public interface MiddleEarth {
     public List<Creature> getAllCreatures();
}

クライアントにはとのインターフェイスのみがありMiddleEarthCreatureクラスパスの実装はありません。

の実装がタイプ、、、およびCreatureのシリアル化可能なオブジェクトである場合。また、これらの実装はコードベースにありますが、クライアントのクラスパスにはありません。ElfManDwarfHobbit

RMIサーバーに中つ国のすべてのクリーチャーのリストを送信するように依頼すると、RMIサーバーCreatureは、上記のクラスのいずれかを実装するオブジェクトを送信します。

クライアントがシリアル化されたオブジェクトを受信すると、それらを逆シリアル化するためにクラスファイルを探す必要がありますが、これらはローカルクラスパスにありません。このストリーム内のすべてのオブジェクトは、欠落しているクラスを探すために使用できる特定のコードベースでタグ付けされています。したがって、クライアントはこれらのクラスを探すためにコードベースに頼ります。そこで、使用されている実際のクリーチャークラスが見つかります。

コードベースは両方向で機能するため、サーバーにCreature(つまりEnt)を送信すると、コードベースでもサーバーが検索されます。

これは、クライアントとサーバーの両方が新しいタイプのクリーチャーを公開する必要がある場合creaturesImpl.jar、コードベースでを更新するだけで、サーバーまたはクライアントアプリケーション自体では何も更新しないことを意味します。

于 2012-05-05T20:36:16.680 に答える