这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
前言
最近项目中碰到个问题,公司有个从外包那买来的系统,这个系统外包已经停止维护了,公司的服务器上只有一堆
class文件,我们也没有最新的源码,结果里面一个请求第三方接口的用到的key过期了,而这个key又是通过硬编码的形式写死在代码里的,导致这条业务失效了,需要紧急修复一下。
想要重新修改代码,打包发布肯定是不可能的了,我们都知道,即时我们改了代码,最终也是编译成class文件,再丢上去,其它的class文件和原来也是一样的,那还不如干脆直接改了那个class文件,最后敲定就这么干。搜了一些修改方式,最后采用了比较方便的一种,成功的解决了这次问题,接下来记录一下,修改的步骤,以便后续不记得的时候查看。
这里要提醒一下,改生产文件的时候先备份,给自己留条后路。
从Hello World开始
写个HelloWorld类,打印一下 HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("helloWorld......");
}
}
编译生成
class文件
HelloWorld.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
public class HelloWorld {
public HelloWorld() {
}
public static void main(String[] args) {
System.out.println("helloWorld......");
}
}
执行 java HelloWorld
到这里,准备工作做好了,接下来,我们来修改一下
class文件
idea安装jclasslib-bytecode-viewer插件
基本操作,这里就不演示了
下载完成后用idea打开
class文件
选中
class文件,点击导航栏View,点击Show Bytecode With Jclasslib
这个时候我们可以看到右侧的菜单弹出对应的
class信息
我们可以看到这里已经给我们划分好了文件夹,我们尝试的这把输出的语句修改一下
修改的是字符串所以应该在常量池里,尝试着找一下,果然找到了。
修改为我们想要的值就可以了,保存完成修改
总结
从这件事中吸收教训,以后类似与这种动态配置的类型值,一定要抽离出来,坚决避免这种硬编码的形式