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()string 返回你human readable form of Object所以如果你调用toStringobjectarray那么它会返回你default toString

默认 toString 实现是

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

你可以清楚地看到这不是你想要的。

您可以使用String带有Charset或默认字符集的构造函数来转换byte[]为字符串

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

参考:

于 2012-10-29T17:34:57.803 回答
0

我的解释是发生这种情况是因为objectinputstreamjava 中的 an 是一种byteinputstream. 因此,您可以使用第二种解决方案。toString()由于对象的实现,第一个不起作用。

于 2012-10-29T17:37:57.280 回答