Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java对象写入类文件_Java_Proxy_Bytecode_Cglib - Fatal编程技术网

将java对象写入类文件

将java对象写入类文件,java,proxy,bytecode,cglib,Java,Proxy,Bytecode,Cglib,是否有任何方法可以将加载的Java对象写入.class文件,或者是否有任何其他类型的文件可以轻松读取以表示实例的属性 例如,CGLIB将创建一个扩展另一个的代理bean,我真的想将这个增强的bean导出到一个文件,看看它是如何增强的。对于CGLIB,实例只能序列化,并且只有在实例的方法拦截器支持序列化的情况下。没有别的办法 为了获得cglib生成的类文件,可以调用 void generateClass(ClassVisitor v) 方法。此方法可以采用ASMClassWriter,调用该方法

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


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

对于CGLIB,实例只能序列化,并且只有在实例的方法拦截器支持序列化的情况下。没有别的办法

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

void generateClass(ClassVisitor v)
方法。此方法可以采用ASM
ClassWriter
,调用该方法后,它可以发出表示类文件的字节数组。但是,这个类文件本身对您帮助不大,因为cglib需要显式初始化该类,例如,将回调处理程序注入类的字段中。这是在库内部完成的。但是,通过手头的类文件和调试模式内省,您可以添加这些片段并了解增强类的工作方式


最后,如果我可以向您推荐一个cglib的替代方案,其中所有这些都比较简单,那么请看一看,它有一个用于提取类文件的直接向前API,并且还提供了与此类文件并行的所谓的
LoadedTypeInitializer
s。后面的初始值设定项包含类的任何设置逻辑,并且易于阅读。而且,它们本身是可序列化的。

在JDK中使用HSDB工具

  • 保持程序运行
  • 运行HSDB工具:

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

  • 输入程序pid

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


  • 您可以使用反射API来分析java运行时对象实例cglib源代码-您可以将java对象序列化为json字符串或流,并使用gson进行反序列化。谢谢,所以不要考虑对象实例。有没有办法将
    generateClass()
    生成的
    enhanced class
    写入
    .class
    文件?将
    ClassWriter
    作为参数传递。之后,在writer上调用
    toByteArray
    ,返回表示类文件的
    byte[]
    数组。但是首先需要
    ClassReader
    ,但是
    ClassReader
    构造函数需要class
    byte[]
    数据。但我所拥有的只是
    类aClass=CglibEnhancedProxy.Class
    。我不知道如何将
    aClass
    转换为
    byte[]
    。不是
    ClassReader
    ,你需要一个
    ClassWriter
    -注意编写者。哦,我明白了。但这似乎帮不了什么忙。因为这个问题是链接到的,所以看起来很难获得增强器。也许值得一提的是,保存的类文件存储在当前目录中,即
    your/package/TheClass.class