2012-10-29 40 views
2

作为练习的一部分,我必须编写一个远程类加载器。它从服务器下载一个类,然后使用defineClass加载它。转换为byte []和String.getBytes

我所做的就是这样的:

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); 

它的工作如预期。

这是为什么?如果你调用toStringarray对象,然后它会回报你default toString

+4

'toString'不编码对象的字节 - 它返回一个包含关于对象信息的字符串。 –

回答

3

Object.toString()字符串,所以将返回human readable form of Object

默认的toString实现

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

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

您可以使用String构造与Charset或默认的字符集,以byte[]转换为字符串

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

参考文献:

0

我的解释是因为java中的objectinputstreambyteinputstream。因此你可以使用第二种解决方案。由于Object的toString()实现,第一个将不起作用。