athas热更新代码
热更新
热更新有什么用?比如,生产环境有一个逻辑不小心写错了,导致资产损失。
如果修改代码,重新发布到生产环境,需要的时间比较长,而且生产环境重启,也可能会影响到其他的用户。
热更新,可以不用重启环境,修改代码对应的字节码,达到修改功能的目的。
一、jad反编译
星号*表示匹配任意路径,也可以直接写具体的路径。
# --source-only,表示只打印源代码
jad --source-only *.TestController > TestController.java
在>符号后面,可以指定输出的路径以及编译后的文件,放在对应的路径。
最好指定输出的路径,找起来比较方便。
如下:
jad --source-only *.TestController > /arthas/TestController.java
二、修改代码
通过 vim 等编辑器修改第一步输出的文件 /arthas/TestController.java ,修改代码。
三、mc 内存编译
编译修改过后的代码。如下:
-d 指定输出的路径
[arthas@14388]$ mc /arthas/TestController.java -d /arthas
Memory compiler output:
E:\arthas\com\example\demo\controller\TestController.class
Affect(row-cnt:1) cost in 1734 ms.
四、热更新代码
retransform 热更新代码。
redefine也可以热更新。redefine命令与arthas其他增强命令trace/watch/tt
等命令冲突,两者会相互重置。
所以推荐使用retransform命令;
[arthas@14388]$ retransform E:/arthas/com/example/demo/controller/TestController.class
retransform success, size: 1, classes:
com.example.demo.controller.TestController
Arthas热更新,有哪些要注意的?
-
Arthas热更新,不支持新增类的属性、方法参数
只能在原来的方法上修改逻辑。 -
Arthas热更新,不支持依赖注入
如果需要依赖注入,可以使用 ApplicationContxt 在方法中初始化对象。