Arthas热更新代码
2024年9月4日小于 1 分钟
Arthas热更新代码
1. sc 命令获取 classLoader
sc -d demo.MathGame
sc -d demo.MathGame | grep classLoader
# 输出
classLoaderHash 7daf6ecc
2. jad 反编译类
jad demo.MathGame -c 7daf6ecc --source-only --lineNumber false > /data/MathGame.java
3.修改源码
- 方式1:vim
- 方式2:本地后修改上传
4. mc 编译源码
如果mc编译报错,则推荐本地编译之后上传class文件
mc -c 7daf6ecc /data/MathGame.java -d /data
5. redefine 上传源码
redefine
命令和jad
/watch
/trace
/monitor
/tt
等命令会冲突。执行完redefine
之后,如果再执行上面提到的命令,则会把redefine
的字节码重置。 原因是 jdk 本身 redefine 和 Retransform 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。
redefine -c 7daf6ecc /data/MathGame.class
5.1 推荐 retransform 命令
retransform /data/MathGame.java
retransform -l
retransform -d 1 # delete retransform entry
retransform --deleteAll # delete all retransform entries
retransform --classPattern demo.* # triger retransform classes
retransform -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
retransform --classLoaderClass 'sun.misc.Launcher$AppClassLoader' /tmp/Test.class