将java对象写入类文件

时间:2016-02-02 06:42:19

标签: java proxy bytecode cglib

有没有办法将加载的Java对象写入.class文件,或者是否可以轻松读取任何其他类型的文件来表示实例的属性。

例如,CGLIB将创建一个扩展另一个的代理bean,我真的想将这个增强的bean导出到file以查看它是如何被增强的。

2 个答案:

答案 0 :(得分:3)

在JDK中使用HSDB工具

  1. 让您的程序继续运行
  2. 运行HSDB工具:

    java -classpath“$ JAVA_HOME / lib / sa-jdi.jar”sun.jvm.hotspot.HSDB

  3. 输入程序pid enter image description here

  4. 选择工具,您可以保存.class文件,这就是您想要的 enter image description here

答案 1 :(得分:2)

对于cglib,实例只能序列化,并且只有实例的方法拦截器支持序列化。没有其他办法。

为了获取cglib生成的类文件,可以调用

void generateClass(ClassVisitor v)

方法。此方法可以使用ASM ClassWriter,它可以在调用方法后发出一个表示类文件的字节数组。然而,这个类文件本身并没有帮助你,因为cglib需要显式地初始化类,例如将回调处理程序注入到类的字段中。这是在库内完成的。但是,使用手头的类文件和调试模式内省,您可以添加这些片段并了解增强类的工作方式。

最后,如果我可以向您推荐cglib的替代方法,其中所有这些都更容易,请查看Byte Buddy,它具有用于提取类文件的直接API,并且还提供所谓的{{1与此类文件并行的s。后面的初始化程序包含类的任何设置逻辑,并且易于阅读。而且,它们本身是可序列化的。