arthas实现类的热部署
arthas实现类的热部署
问题
我们要实现一个功能,前台输入1返回hello,其他输入返回world。如下,这里字符串判断相等错误使用了等号。

导致前台输入1也是返回world。

修复
1、下载arthas,上传服务器
https://arthas.aliyun.com/

2、启动arthas
java -jar arthas-boot.jar
输入编号1,连接到我们的应用程序:

3、使用jad命令反编译字节码文件,生成java文件保存至/usr/local/opt/目录
jad --source-only com.example.controller.BookController > /usr/local/opt/BookController.java

可以看到java文件已经生成。
4、使用记事本打开java文件,可以看到22行使用的等号,这就是问题根源。

将22行改为equals,保存

5、查找类加载器的哈希码
语法:sc -d 类的全路径名
sc -d com.example.controller.BookController

6、复制上一步的哈希码。使用mc命令编译修改过的代码
语法:mc -c 类加载器哈希码 java文件路径 -d 字节码文件路径
mc -c 3d646c37 /usr/local/opt/BookController.java -d /usr/local/opt
执行上述命令后,就会生成字节码文件

7、使用retransform命令将新的字节码加载到内存中

8、测试验证
浏览器输入1,返回hello

输入其他值,返回world

注意
1、使用retransform命令只是将字节码信息更新至内存中。如果程序重启,读取到的还是本地磁盘的字节码信息,还是有问题的字节码。除非将class文件放到jar包中更新。
2、使用retransform命令不能添加方法或字段,也不能更新正在执行的方法。
