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.

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

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。