现在,我有一台运行ObjectInputStream
和ObjectOutputStream
的服务器。
我遇到的问题是我有一个自定义(匿名)类,它扩展java.lang.Date
我试图发送给客户端然后编译。
所以我没有在客户端定义类,但我想以编程方式编译类。我尝试了很多不同的方法,但是每次我得到一个ClassNotFoundException
因为该类最初不在客户端。
Class<?> dateClass = (Class<?>) in.readObject(); //This is where the CNF Exception occurs
Compiler.compileClass(dateClass);
答案 0 :(得分:7)
Java Serialization机制假定反序列化JVM已知类,它不发送类定义。特别是,在序列化Class
对象时,不要发送该类的字节代码,而只是指示接收VM查找具有特定名称的类的Class
对象。 / p>
另请注意,Class
对象表示在JVM中定义的类,即类的字节码已加载。在加载类之后尝试编译为类来生成字节码是没有意义的。
因此,我们需要以某种方式将类定义提供给客户端。最简单的方法是像客户端需要的任何其他类一样(通过将其打包在客户端的jar文件中,或者用于安装客户端程序的任何方法)。如果这不可能,您可以通过网络加载类定义,例如使用URLClassLoader
,或者您可以通过序列化流发送类文件,并在客户端接收时使用{{1}加载类。
PS:这个问题完全独立于该类是否被命名。以下测试代码显示匿名类的对象可以很好地序列化和反序列化(如果接收VM具有类定义):
ClassLoader.defineClass