2009-06-02 10 views
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でさえも可能です。このまたはそれを行うことができますそこにどんな小さなlibにはありますか?

+1

あなたはRMIを再発明しようとしているようですね。 –

答えて

5

私はあなたが望むものが完全な一般性で可能ではないと思います。バイトコードからクラスを定義する行為は可逆的ではありません。

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

また、あなただけのHTTP経由でアクセスできるクラスファイルを作ることができるし、直接URLClassLoaderオンを使用:あなたが行うことができるはず何、しかし、直接(それはURLClassLoaderだと仮定して)バイトコードファイルを読むことです受信側。

+1

私はワイヤ上で.classファイルの内容をプルしてから(ファイルまたはメモリのどちらかで)再構成し、クラスローダーにそのファイルをロードさせる必要があると思います。 .classファイルをファイルとして再構成する場合は、URLClassLoaderを使用できます。メモリ内で再構成する場合は、おそらく独自のクラスローダーを定義する必要があります。 – Jared

+1

URLClassLoaderを使用するには、URLを「再構成」する必要はありません。 * URL * ClassLoaderという名前は付けられていません.HTML URLを喜んで受け取り、すべてのハードワーク自体を行います。結局のところ、アプレットとのやり取りはそうです。 –

0

あなたはjava serialization interface

編集をチェックする必要があります:

私はあなたのポストを再読し、あなたが他の側にクラスを定義する話をしています。これはあなたが達成しようとしていることがdistribute objects across the networkにあると思うようになります。

また、サーバーとクライアントの共有と同じインターフェイスを両方の場合、あなたは単にあなたがあなた自身の直列化方法を書くことができjava reflection

+1

クラスのインスタンスではなく、ワイヤを介してクラスDEFINITIONを取得する必要があるようです。 RMIやリフレクションなどのテクノロジでは、クラスローダにDEFINITIONクラスを使用できることが前提条件です。 – Jared

+0

さて、はい、クラスローダーはワイヤーでバイトコードをロードできます。 –

-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つです。

メモリストリームオブジェクトを使用して、各データフィールドを書き出し、複雑なオブジェクトのカスケード書き込みを行うには、iserializableインターフェイス(javaでは存在しないかもしれませんが、自分自身を実装するための単純なインターフェイスです)を実装します。

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

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

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/ 
関連する問題