我有一个java模板类,我想修改一个String字段。 我可以实例化该类的对象,获取其对应的Class对象,并使用反射修改该字段,到目前为止一切顺利。 但是我如何将字节码实际保存到文件系统?
因为我认为如果我到达原始模板类的ClassLoader,转到InputStream并尝试保存到文件,我将获得原始(即未修改的)类实现。是这样吗?
理想情况下,我还需要将类名更改为更有意义的内容。
首先可以使用纯java完成这两件事吗? 或者我是否必须求助于外部图书馆?
答案 0 :(得分:4)
使用反射修改字段时,您不会更改类本身的任何内容。这只是设置变量的一种奇特方式。所以首先要担心的是没有改变的字节码。
无论如何,AFAIK在运行时无法轻松访问字节码。 JVM从类文件(从文件或内存数据)创建类,但是一旦加载了类,没有特别的理由保持数据。最有可能的是,它只会保留一个不必与原始类文件相对应的优化表示。
我认为有一些API如Java代理在运行时处理字节码,但目前尚不清楚它们的工作情况,部分原因是JVM确实优化了。
答案 1 :(得分:0)
查找汇编程序/反汇编程序对。反汇编类文件,替换字符串值,然后编译回类文件。请注意,字符串常量可以从几个点引用,因此可能必须添加常量并仅更改一个引用。如果新字符串值与旧字符串的长度相同(采用UTF-8编码),那么您只需用二进制文件编辑器替换常量。如果长度不同,则替换会破坏整个类文件结构。