我需要更改已部署的Java程序中的字符串常量,即编译后的值.class
- 文件。它可以重新启动,但不容易重新编译(尽管如果这个问题没有答案,这是一个不方便的选择)。这可能吗?
更新:我刚刚用十六进制编辑器查看了该文件,看起来我可以轻松更改那里的字符串。这会起作用吗,也就是说,这不会使文件的某种签名无效吗?旧的和新的字符串都是字母数字的,并且如果需要的话可以具有相同的长度。
更新2:我修好了。因为我需要更改的特定类非常小,并且在项目的新版本中没有更改,所以我可以编译它并从那里获取新类。出于教育目的,仍然对不涉及编译的答案感兴趣。
如果您有此类的资源,那么我的方法是:
- 获取 JAR 文件
- 获取单个类的源代码
- 使用类路径上的 JAR 来编译源代码(这样,您就不必编译其他任何内容;JAR 已包含二进制文件也不会造成损害)。您可以使用最新的 Java 版本;只需使用降级编译器
-source
and -target
.
- 使用以下命令将 JAR 中的类文件替换为新文件
jar u
或 Ant 任务
Ant 任务示例:
<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 对代码做了一些检查,但有.class 文件中没有校验和 https://en.wikipedia.org/wiki/Java_class_file.
您必须保留长度;否则类加载器会感到困惑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)