2、解压压缩包,并在代码运行的机器上 启动 arthas
java -jar arthas-boot.jar
效果如下图
3、选择对应应用程序
输入程序前的数字编号即可 例如 选择 ConsumerWebApplication 则输入 4 回车
看见这个图 则表示连接成功
如果没有成功 可去$HOME/logs/arthas/arthas.log 查看日志
正式开始
1、打开我们的代码 复制我们类的全路基
例如:com.alibaba.nacos.client.naming.net.NamingProxy
2、将该类的.class文件 反编译成java文件 到指定目录中(有源文件的 直接 在源文件上修改 )
jad --source-only com.alibaba.nacos.client.naming.net.NamingProxy > D://tmp//NamingProxy.java
3、使用编译器 打开 在想要修改代码的地方 进行修改
4、使用arthas提供的编译器 对java文件进行编译 编译后的class文件放到指定文件夹下
mc D://tmp//NamingProxy.java -d D://tmp
会生成一些class文件
5、将生成的class文件扔到线上
redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy$5.class
redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy$3.class
redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy$4.class
redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy.class
注意事项及碰见的问题
注意:虽然生成了 7个文件 但是 我只上传了 4个 是因为 其他三个在虚拟机中没有找到 上传也会报错的
怎么知道 有没有这些文件呢?
使用 sc 命令 查看JVM已加载的类信息
sc com.alibaba.nacos.client.naming.net.*
注意:redefine 后 这些文件 就不能被回滚了 重启后失效
问题: 将类的.class文件 反编译成java文件 再将java文件编译成class文件时 会报错
例如
编译的时候 会进行类型校验 会报
不兼容的类型: java.lang.Object无法转换为com.alibaba.nacos.client.naming.net.HttpClient.HttpResult
目前解决的方法 是 将 源文件 代码 粘过来
有源文件 或许 可以直接在源文件上进行修改
有时候源码粘过来也编译报错,暂时无解。
大部分时间是我们自己的代码中织入代码,因此自己本地启动后将class文件传上去也可以