通过套接字发送匿名类? (Java中的Object..Stream)

时间:2012-02-25 23:15:09

标签: java class classnotfoundexception objectoutputstream objectinputstream

现在,我有一台运行ObjectInputStreamObjectOutputStream的服务器。

我遇到的问题是我有一个自定义(匿名)类,它扩展java.lang.Date我试图发送给客户端然后编译。

所以我没有在客户端定义类,但我想以编程方式编译类。我尝试了很多不同的方法,但是每次我得到一个ClassNotFoundException因为该类最初不在客户端。

Class<?> dateClass = (Class<?>) in.readObject(); //This is where the CNF Exception occurs
Compiler.compileClass(dateClass);

1 个答案:

答案 0 :(得分:7)

Java Serialization机制假定反序列化JVM已知类,它不发送类定义。特别是,在序列化Class对象时,不要发送该类的字节代码,而只是指示接收VM查找具有特定名称的类的Class对象。 / p>

另请注意,Class对象表示在JVM中定义的类,即类的字节码已加载。在加载类之后尝试编译为类来生成字节码是没有意义的。

因此,我们需要以某种方式将类定义提供给客户端。最简单的方法是像客户端需要的任何其他类一样(通过将其打包在客户端的jar文件中,或者用于安装客户端程序的任何方法)。如果这不可能,您可以通过网络加载类定义,例如使用URLClassLoader,或者您可以通过序列化流发送类文件,并在客户端接收时使用{{1}加载类。

PS:这个问题完全独立于该类是否被命名。以下测试代码显示匿名类的对象可以很好地序列化和反序列化(如果接收VM具有类定义):

ClassLoader.defineClass