微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/java/125120.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐