Java :(部分)类的序列化(不是对象!)

时间:2014-12-11 09:55:38

标签: java serialization classloader

我目前正致力于将一个组件及其依赖项打包在一起的任务,并从中创建一个包含所有必需内容的独立组件。

我的情况是我可能有用户定义的类,我也需要包含在这个组件中。

我正在寻找一种以纤巧/智能方式序列化它们的方法。这些类具有继承层次结构,例如:

FrameWorkSuper
--------------
UserSuper 
UserClass

有没有办法只序列化类的用户定义部分以保持足迹小?任何源自框架的东西肯定都包含在最终组件中。因此,我希望稍后序列化并加载整个用户定义的部分,使得类得到框架部分也在包中。

有没有办法实现我应该使用的任务或任何建议?

1 个答案:

答案 0 :(得分:1)

我认为您要做的是传输用户定义类的实际字节代码。

  1. 如果您没有类的字节代码而只有源代码,则需要先编译它。我建议使用JavaCompiler
    • 由于将所有内容编译到磁盘然后再将其读取到字节数组有点繁琐,您可能希望使用自己的FileManager和JavaFileObject实现,如有必要,我可以提供有关此步骤的详细信息。
  2. 获得班级的字节代码后,将其发送到您想要的位置(文件,数据库,远程站点)。
  3. 当“反序列化”(正如其他人所说,序列化不是正确的术语)时,从任何地方加载字节代码。
  4. 创建一个自定义类加载器,它获取所有类的字节代码,并将其findClass方法覆盖为

    // first try our cache of loaded classes
    if (loadedClasses.containsKey(name)) {
        return loadedClasses.get(name);
    }
    
    // that didn't work, maybe the class was compiled but not yet loaded
    if (compiledClasses.containsKey(name)) {
        // get the representation from the cache
        InMemoryClassJavaFileObject inMemoryRepresentation = compiledClasses.get(name);
        // let our parent define the class
        Class<?> clazz = defineClass(name, inMemoryRepresentation.getData(), 0, inMemoryRepresentation.getData().length);
        // and store it in the cache for later retrieval
        loadedClasses.put(name, clazz);
        return clazz;
    }
    

    请注意,您无需创建InMemoryClassJavaFileObject,只需使用字节数组即可。

  5. 要实现上述目标,您需要从其字节代码中获取类的完全限定名称。要么单独提供信息,要么使用this method
  6. 这使您可以在远程站点上访问类本身:您可以创建实例并使用它们的方法。