在定位问题或快速验证问题的时候,如果还需要编码、推送到仓库、在编译发布,整个流程会比较长,我们可以使用Arthas完成热修改代码,实时看到最新效果
启动arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
反编译&修改类
- 找到对应的类全名: sc命令
# arthas命令: 找到对应的全量类名
sc *.UserController
# sc: Search-Class
# 输出com.example.demo.arthas.user.UserController
- 反编译类:jad
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
# jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码
- 修改类文件
vim /tmp/UserController.java
热编译&热加载
- 查找类加载器
sc -d *UserController | grep classLoaderHash
#输出:classLoaderHash 1be6f5c3
- 热编译
$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp
#mc: Memory Compiler/内存编译器
- 加载新类
使用redefine命令重新加载新编译好的UserController.class:
redefine /tmp/com/example/demo/arthas/user/UserController.class
网友评论