2

次の問題があります。タイプ(java.lang.Class)をネットワーク経由で送信し、反対側でクラスを「定義」したい。

私はそのように試しました:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(MyClass.class);

および受信側:

ByteArrayInputStream bis = new ByteArrayInputStream(request.getBytes());
ObjectInputStream ois = new ObjectInputStream(bis);
Class c = (Class) ois.readObject(); // ClassNotFoundException

したがって、明らかに、クラスの生のバイトコードを送信して、

ClassLoader.defineClass(bytes, ..

しかし残念ながら、ロードされたクラスのバイトコードを取得する方法がわかりません。私は次のようなものを探しています:

byte[] byteCode = MyClass.class.toByteArray();

これは標準のJDKでも可能ですか、それともそれを実行できる小さなライブラリがありますか?

4

4 に答える 4

5

あなたが望むことは完全に一般的に可能だとは思いません。バイトコードからクラスを定義する行為は元に戻せません。ただし、できることは、バイトコード ファイルを直接読み取ることです (それがURLClassLoader.

MyClass.class.getResourceAsStream("Myclass.class")

または、HTTP 経由でクラス ファイルにアクセスできるようURLClassLoaderにし、受信側で を直接使用することもできます。

于 2009-06-02T21:34:44.557 に答える
1

メモリからこれを行うことはできません。クラスを定義するバイト コードが必要です。ほとんどのクラスでは、JVM に問い合わせることで見つけることができます。http://www.exampledepot.com/egs/java.lang/ClassOrigin.htmlからのこのコードは、開始する必要があります。

// Get the location of this class
Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/
于 2009-06-02T22:12:50.113 に答える
0

Javaシリアル化インターフェースを確認する必要があります

編集 :

あなたの投稿を読み直しましたが、反対側でクラスを定義することについて話しているのです。これにより、あなたが達成しようとしているのは、オブジェクトをネットワーク全体に分散させることだと思いました。

また、サーバーとクライアントの両方が同じインターフェースを共有している場合は、Java リフレクションを介してオブジェクトを簡単に作成できます。

于 2009-06-02T21:25:53.547 に答える
-3

独自のシリアル化メソッドを作成できます。

それで

public byte[] Serialize()
{

// serialize each field in turn here.

return data;
}


public void Deserialize(byte[] data)
{

// deserialize data in the same order it was serialized.

}

これは、シリアル化のために .Net で実装するメソッドです。この方法の重要な点は、シリアル化を完全に担当できることです。このタイプの通信のバージョンがまったくない場合は、長く続くかもしれませんが、製品が成長するにつれて複数のバージョンが発生する場合、これは私たちが見つけた数少ない信頼できる方法の 1 つです。

メモリ ストリーム オブジェクトを使用して各データ フィールドを書き出し、直列化可能なインターフェイス (Java には存在しない可能性がありますが、自分で実装するための単純なインターフェイスです) を実装することにより、複雑なオブジェクトの書き込みをカスケードします。

企業サーバーでもクライアントと同じ dll を使用します。

シリアル化は、使用しているプラ​​ットフォームに関係なく問題です。

于 2009-06-02T21:25:54.670 に答える