【问题标题】:write java object into class file将java对象写入类文件
【发布时间】:2016-08-18 20:28:54
【问题描述】:

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

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

【问题讨论】:

标签: java proxy bytecode cglib


【解决方案1】:

在JDK中使用HSDB工具

  1. 保持程序运行
  2. 运行 HSDB 工具:

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

  3. 输入程序pid

  4. 选择工具,你可以保存.class文件,这就是你想要的

【讨论】:

  • 也许值得一提的是,保存的类文件在当前目录中存储为your/package/TheClass.class
【解决方案2】:

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

为了得到一个cglib生成的类文件,你可以调用

void generateClass(ClassVisitor v)

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

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

【讨论】:

  • 谢谢,所以忘记对象实例。有没有办法将generateClass()生成的enhanced class写入.class文件?
  • 传递 ClassWriter 作为参数。然后在 writer 上调用toByteArray,返回一个代表类文件的byte[]数组。
  • 但是你首先需要一个ClassReader,但是ClassReader构造函数需要类byte[]数据。但我所拥有的只是Class<?> aClass = CglibEnhancedProxy.class。我不知道如何将aClass 转换为byte[]
  • 不是ClassReader,您需要ClassWriter - 请注意Writer
  • 哦,我明白了。但这似乎并没有太大帮助。因为这个问题是链接到A Spring AOP Strange Problem的,所以貌似很难得到增强器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2015-05-15
  • 2015-07-09
相关资源
最近更新 更多