[英]Send an Anonymous class over sockets? (Object..Stream in Java)
所以現在,我有一個使用ObjectInputStream
和ObjectOutputStream
運行的服務器。
我遇到的問題是我有一個自定義(匿名)類,它擴展了我試圖發送給客戶端然后編譯的java.lang.Date
。
所以我沒有在客戶端定義類,但我想以編程方式編譯類。 我嘗試了很多不同的方法,但每次我得到一個ClassNotFoundException
因為該類最初不在客戶端。
Class<?> dateClass = (Class<?>) in.readObject(); //This is where the CNF Exception occurs
Compiler.compileClass(dateClass);
Java Serialization機制假定反序列化JVM已知類,它不發送類定義。 特別是,在序列化Class
對象時,不要發送該類的字節代碼,而只是指示接收VM查找具有特定名稱的類的Class
對象。
另請注意, Class
對象表示在JVM中定義的類,即類的字節碼已經加載。 在加載類之后嘗試編譯到類以生成該字節碼是沒有意義的。
因此,我們需要以某種方式將類定義提供給客戶端。 最簡單的方法是像客戶端需要的任何其他類一樣(通過將其打包在客戶端的jar文件中,或者用於安裝客戶端程序的任何方法)。 如果這不可能,您可以通過網絡加載類定義,例如使用URLClassLoader
,或者您可以通過序列化流發送類文件,並在客戶端接收它時使用ClassLoader.defineClass
加載類。
PS:這個問題完全獨立於該類是否被命名。 以下測試代碼顯示匿名類的對象可以很好地序列化和反序列化(如果接收VM具有類定義):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
Serializable payload = new Serializable() {
@Override
public String toString() {
return "hello from the anonymous class";
}
};
oos.writeObject(payload);
oos.writeObject(payload.getClass());
}
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
System.out.println(in.readObject());
System.out.println(in.readObject());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.