我想修改在 Java 应用程序中硬编码的连接字符串(没有源的 jar)。
我认为可以反编译 jar,然后更改源并重新编译为新的 jar,但是有更快的方法吗?
编辑:
- 这是一个独立的应用程序,而不是我从自己的代码加载的 jar
- 我怀疑它会被混淆:利基科学应用,作者擅离职守。
- 需要在应用程序运行时修改“内存中”字符串的解决方案也足够了,但并不理想
我想修改在 Java 应用程序中硬编码的连接字符串(没有源的 jar)。
我认为可以反编译 jar,然后更改源并重新编译为新的 jar,但是有更快的方法吗?
编辑:
在使用该 jar 的应用程序中,您可以使用反射来设置连接字符串。(反射甚至可以与私人二传手一起使用)。
显然,如果 setter 是公开的,您可以直接调用它而无需反思。
我认为反编译可能是最快的方法,前提是代码没有被混淆,以至于反编译/编译往返是不可能的。无论如何,您都必须反编译代码才能找到连接字符串,所以您已经完成了一半。
更重要的是,您可以利用此方法将连接字符串拉出到属性文件中,因此(希望)只执行一次反编译!
由于 Jars 通常不会被压缩,因此地址在 Jar 中以纯文本形式显示的可能性很小。您可以尝试使用不怕二进制数据的编辑器(我使用 vim)编辑 Jar,只需搜索并更改文本,前提是旧地址和新地址使用相同数量的字符。这很原始但非常简单。
如果它不起作用,您将需要其他方法之一。
当然,如果这种方法失败,您需要保留 jar 的备份副本。
由于 jar 文件只是具有一定结构的 ZIP 文件,因此您可以使用 zip 工具(WinZip 等)来提取类文件;然后使用十六进制编辑器修改类文件(如果新的连接字符串与旧的连接字符串具有相同的长度,应该不会太难);之后,您将其压缩回 jar 文件中。
当然,当上述所有其他可能性都不起作用时,这应该只是你最后的尝试。
我假设你已经想到了这一点,但如果 .jar 文件中的编译方法看起来像这样,也许你可以简单地使用继承:
公共字符串 getConnectionString(){...
然后只需扩展类,覆盖该方法以返回您的新字符串并改用您的类。显然,这只适用于超类不是最终的,方法不是最终的,并且它是公共的或受保护的(如果您可以使用相同的包名)。