我需要更改部署的
Java程序中的字符串常量,即编译的.class文件中的值.它可以重新启动,但不容易重新编译(虽然这是一个不方便的选项,如果这个问题没有产生任何答案).这可能吗?
更新:我只是使用十六进制编辑器查看文件,看起来我可以轻松地更改字符串.那工作是否不会使文件的某种签名无效?旧的和新的字符串都是字母数字,如果需要,可以是相同的长度.
更新2:我修正了因为我需要改变的特定类是非常小的,并且在新版本的项目中没有改变,我可以编译它,并从那里拿出新的类.仍然感兴趣的答案,不涉及编译,但为教育目的.
解决方法
如果你有这个类的来源,那我的做法是:
>获取JAR文件
>获取单个类的源代码
>在类路径中使用JAR编译源代码(这样就不必编译任何其他东西;它不会伤害到JAR已经包含二进制文件).您可以为此使用最新的Java版本;只需使用-source和-target降级编译器.
>使用jar u或Ant任务用新的JAR替换JAR中的类文件
蚂蚁任务示例:
<jar destfile="${jar}" compress="true" update="true" duplicate="preserve" index="true" manifest="tmp/Meta-INF/MANIFEST.MF" > <fileset dir="build/classes"> <filter /> </fileset> <zipfileset src="${origJar}"> <exclude name="Meta-INF/*"/> </zipfileset> </jar>
在这里我也更新清单.先放入新类,然后添加原始JAR中的所有文件. duplicate =“preserve”将确保新的代码不会被覆盖.
如果代码未签名,您还可以尝试替换字节,如果新字符串的长度与旧字符的长度完全相同. Java对代码进行了一些检查,但是有no checksum in the .class files.
你必须保留长度;否则类加载器会变得困惑.