2012-10-29 42 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()實現,第一個將不起作用。