我想修改一个硬编码在Java应用程序中(没有源代码的jar)的连接字符串。
我猜想可以反编译jar,然后更改源代码并重新编译成新的jar,但有没有更快的方法?
编辑:
- 这是一个独立的应用程序,不是我从自己的代码中加载的jar
- 我怀疑它没有被混淆:它是一个小众科学应用程序,作者失踪了。
- 一种在应用程序运行时“内存中”修改字符串的解决方案也可以满足要求,但不是理想的方法。
我想修改一个硬编码在Java应用程序中(没有源代码的jar)的连接字符串。
我猜想可以反编译jar,然后更改源代码并重新编译成新的jar,但有没有更快的方法?
编辑:
由于Jars经常不被压缩,因此地址以纯文本形式可见的可能性很小。您可以尝试使用一个不惧怕二进制数据的编辑器(我使用vim)来编辑Jar,并搜索和更改文本,前提是旧地址和新地址使用相同数量的字符。这是原始但非常简单的方法。
如果不起作用,您将需要其他方法。
当然,如果这种方法失败了,您会想要保留Jar的备份副本。
由于jar文件只是具有特定结构的ZIP文件,因此您可以使用zip工具(WinZip等)提取类文件;然后使用十六进制编辑器修改类文件(如果新连接字符串与旧连接字符串具有相同的长度,则不应太困难);之后,将其压缩回jar文件。
当然,当上述所有其他可能性都无法解决问题时,这应该只是您的最后一招。
public String getConnectionString(){...
那么只需扩展该类,覆盖该方法以返回您的新字符串并使用您的类即可。显然,这仅在超类不是final、该方法不是final且它是public或protected(如果您可以使用相同的包名称)时才有效。
public static final String
,则编译器可能已将其作为常量内联。我不确定会发生什么,但这可能会发生... - sleske