Java 保存用反射修改的类的字节码

Java 保存用反射修改的类的字节码,java,reflection,save,bytecode,Java,Reflection,Save,Bytecode,我有一个java模板类,我想修改其中的一个字符串字段。 我可以实例化该类的一个对象,获取其对应的类对象,并使用反射修改字段,到目前为止还不错。 但是如何将字节码保存到文件系统中呢 因为我认为如果我访问原始模板类的类加载器,访问InputStream并尝试保存到文件,我将获得原始(即未修改的)类实现。是这样吗 理想情况下,我还需要将类名更改为更有意义的名称 这两件事可以首先使用纯java来完成吗? 或者我必须求助于外部库吗?当您使用反射修改字段时,您并没有改变关于类本身的任何内容。这只是一种设置变

我有一个java模板类,我想修改其中的一个字符串字段。 我可以实例化该类的一个对象,获取其对应的类对象,并使用反射修改字段,到目前为止还不错。 但是如何将字节码保存到文件系统中呢

因为我认为如果我访问原始模板类的类加载器,访问InputStream并尝试保存到文件,我将获得原始(即未修改的)类实现。是这样吗

理想情况下,我还需要将类名更改为更有意义的名称

这两件事可以首先使用纯java来完成吗?
或者我必须求助于外部库吗?

当您使用反射修改字段时,您并没有改变关于类本身的任何内容。这只是一种设置变量的奇特方式。所以一开始就不用担心字节码的变化

不管怎么说,在运行时你很难访问字节码。JVM从类文件(从文件或内存中的数据)创建类,但一旦类被加载,就没有特别的理由保留数据。最有可能的是,它将只保留一个优化的表示,而不必与原始类文件相对应


我认为有些API(如Java agent)在运行时处理字节码,但不清楚它们的工作情况如何,部分原因是JVM确实进行了优化。

当您使用反射修改字段时,您没有改变类本身的任何内容。这只是一种设置变量的奇特方式。所以一开始就不用担心字节码的变化

不管怎么说,在运行时你很难访问字节码。JVM从类文件(从文件或内存中的数据)创建类,但一旦类被加载,就没有特别的理由保留数据。最有可能的是,它将只保留一个优化的表示,而不必与原始类文件相对应


我认为有一些API,比如Java agent,可以在运行时处理字节码,但不清楚它们的工作情况如何,部分原因是JVM确实进行了优化。

找到一对汇编器/反汇编器。反汇编类文件,替换字符串值,并编译回类文件。请注意,字符串常量可以从多个点引用,因此您可能需要添加一个常量并仅更改一个引用。如果新字符串值与旧字符串值具有相同的长度(在UTF-8编码中),则只需使用二进制文件编辑器替换常量。如果长度不同,则替换将破坏整个类文件结构。

查找汇编程序/反汇编程序对。反汇编类文件,替换字符串值,并编译回类文件。请注意,字符串常量可以从多个点引用,因此您可能需要添加一个常量并仅更改一个引用。如果新字符串值与旧字符串值具有相同的长度(在UTF-8编码中),则只需使用二进制文件编辑器替换常量。如果长度不同,替换将破坏整个类文件结构