java – 在编译的类中更改字符串常量

前端之家收集整理的这篇文章主要介绍了java – 在编译的类中更改字符串常量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要更改部署的 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.

你必须保留长度;否则类加载器会变得困惑.

原文链接:https://www.f2er.com/java/125120.html

猜你在找的Java相关文章