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 在方法中初始化对象。

posted on 2023-07-16 21:32  乐之者v  阅读(86)  评论(0编辑  收藏  举报

导航