2012-02-11 6 views
1

私はJavaの抽象クラスをスレッドにほぼ似ており、もう1つは実際のJavaスレッドに自分の「スレッド」をスケジューリングしています。私がしたいことは、自分の「スレッド」クラスを継承し、run()関数をオーバーライドしてからシリアライズ可能にし、それらをネットワーク上で送信して他の場所で実行できるクラスを作成することです。関数をJavaのデータとしてシリアライズするには?

明白な問題は、受信者は送信される実際のクラスについて知らず、そのクラスをスーパークラスにキャストしても役立たないということです。

私が知りたいことは、ネットワーク上で匿名バイトコードをシリアル化して送信する方法があるかどうかです。もしそうなら、どうですか?例は非常に感謝します。

+1

RMIを使用してリモートから関数を呼び出すほうが簡単かもしれないと思います。 –

+0

私はこれまで実際に聞いたことがありません。ありがとう!確かめます。 – cabbagebot

答えて

2

Javaシリアル化は、オブジェクト、つまりクラスのインスタンスをシリアル化します。オブジェクトを直列化すると、実際にはメンバーフィールドの値が何とか格納されます。メソッドのロジックは直列化を超えており、クラスファイルに格納されています。 あなたが実際にやりたいことは、クラスファイルとクラスのインスタンスをネットワーク経由で送信することです。

良いことは、これを行うことができることです。 ClassLoader.getResoureAsStream()を使用して適切なclassファイルを探し、それをバイトのシーケンスとして相手側に送信します。他の側は明らかにこの瞬間のでご送信側アプリケーションによって知られていたクラスは、受信側のJVMで利用できるようになり、それを受信し、その後、

ClassLoader.defineClass(String name, byte[] b, int off, int len)

を呼び出すことができるはずです。今では、このクラスのインスタンスを送信するために定期的なシリアル化メカニズムを使用することができ、すべてがうまくいくはずです。

+0

これは素晴らしいですね!私はクラスターエンジンを構築していますが、私はこのようにするためにデザインを大幅に変更する必要はないと思います。それがまるでRMIよりもクラス全体を送るのが速いかどうかは別の質問ですが、優れた答えです!ありがとう! – cabbagebot

関連する問題