前言
最近项目中碰到个问题,公司有个从外包那买来的系统,这个系统外包已经停止维护了,公司的服务器上只有一堆
class
文件,我们也没有最新的源码,结果里面一个请求第三方接口的用到的key
过期了,而这个key
又是通过硬编码的形式写死在代码里的,导致这条业务失效了,需要紧急修复一下。
所以聪明的你,能想到的最简单的方式就是 ,直接修改生成的class
文件,这样可以最小化的修改系统代码,不会导致其他功能失效,搜了一些修改方式,最后采用了比较方便的一种,成功的解决了这次问题,接下来记录一下,修改的步骤,以便后续不记得的时候查看。
这里要提醒一下,改生产文件的时候先备份,给自己留条后路。
1. 从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
文件
2. idea安装jclasslib-bytecode-viewer插件
基本操作,这里就不演示了
下载完成后用idea打开
class
文件
选中
class
文件,点击导航栏View,点击Show Bytecode With Jclasslib
这个时候我们可以看到右侧的菜单弹出对应的
class
信息
我们可以看到这里已经给我们划分好了文件夹,我们尝试的这把输出的语句修改一下
修改的是字符串所以应该在常量池里,尝试着找一下,果然找到了。
修改为我们想要的值就可以了,保存完成修改
总结
从这件事中吸收教训,以后类似与这种动态配置的类型值,一定要抽离出来,坚决避免这种硬编码的形式