2

演習の一環として、リモートクラスローダーを作成する必要がありました。サーバーからクラスをダウンロードし、defineClassを使用してロードします。

私がしたことは次のようなものでした:

in=new ObjectInputStream(s.getInputStream());
Object o = in.readObject();
return defineClass(className,o.toString().getBytes(), 0, o.toString().length());

そして、私はjava.lang.ClassFormatError: Incompatible magic value

しかし、私がこれを書いたとき

in=new ObjectInputStream(s.getInputStream());
byte[] classData=(byte[])in.readObject();
return defineClass(className,classData, 0, classData.length);

期待通りに動作しました。

何故ですか?

4

2 に答える 2

3

Object.toString()文字列はあなたを返しますhuman readable form of Objectしたがって、オブジェクトを呼び出すとtoStringarrayそれはあなたを返しますdefault toString

デフォルトのtoString実装は

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

これがあなたが望んでいたものではないことがはっきりとわかります。

文字列に変換するには、Stringコンストラクターまたはデフォルトの文字セットを使用できますCharsetbyte[]

byte[] utf8Bytes = original.getBytes("UTF8");
String roundTrip = new String(utf8Bytes, "UTF8");

参照:

于 2012-10-29T17:34:57.803 に答える
0

my interpretation is that happens because an objectinputstream in java is kind of an byteinputstream. Therefore u can use the 2nd solution. the first wouldn't work because of the toString() implementation of Object.

于 2012-10-29T17:37:57.280 に答える