2

長い間検索しましたが、その答えは見つかりませんでした:

私にはサーバーがあり、クライアントがあります。ObjectInputStreamサーバーは、およびを介してオブジェクトを受信する必要がありますObjectOutputStreamclassこれは、サーバー上で既知のすべてのサーバーですでに機能します。今、私はサーバーが知らないObjectのを送りたいです。class彼はそのクラスのインターフェースしか知りません。そしてそれは明らかに失敗します...

どうすれば回避できClassNotFoundExceptionますか?インターフェイスが解決策だと思いました。インターフェースで知っている関数にアクセスしたいだけですが、Javaはとにかくクラスを持ちたいと思っています。

ありがとうございました。

4

3 に答える 3

3

道はない。オブジェクトに対してメソッドを実行できるようにするには、オブジェクトの具象クラスのバイトコードが必要です。そのインターフェースは十分ではありません。

于 2013-02-26T13:19:49.030 に答える
0

一部のクラスのオブジェクトは、JVMにこのクラスがロードされている場合にのみJVMに存在する可能性があります。おそらく、不明なタイプのオブジェクトを送信する代わりに、オブジェクトを説明する既知のデータ構造、つまりHashMapを送信する方が適切です。したがって、実行する代わりに:

MySecretClass o = new MySecretClass ();
o.setFoo ("Hello, World!");
o.setBar (123);
send (o);

次のことを行います。

Map o = new HashMap ();
o.put ("foo", "Hello, World!");
o.put ("bar", 123);
send (o);
于 2013-02-26T13:20:58.400 に答える
0

サーバー上で特定のクラスのバイトコードが必要なため、想像どおりには機能しません。

クライアントとサーバーの両方に認識されるクラスのプロキシ オブジェクトを送信できます。プロキシには、サーバーに認識されていないクラスのオブジェクトが含まれ、そのクラスはバイト配列としてプロキシに格納されます。プロキシ クラスはExternalizableであり、 Classloader.defineClassを使用して、プロキシ オブジェクトがデシリアライズされるときにサーバー JVM に不明なクラスを動的に作成します (クライアントから渡されたクラス定義のバイト配列を使用)。正確には高速ではありませんが、クラスの定義を2回送信してロードしないなど、最適化することができます.

クライアントから渡されたオブジェクトでインターフェイス固有のメソッドを直接呼び出す必要がある場合は、プロキシにインターフェイスを実装させ、プロキシ オブジェクト (java.lang.reflect.Proxy/InvocationHandler) で動的プロキシ パターンを使用して呼び出しをプロキシ対象に渡します。以前は未知のクラスのオブジェクト。

かなり複雑ですが、このようにできると思います。

于 2013-02-26T13:57:36.560 に答える