jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.javamc /tmp/UserController.java -d /tmpredefine /tmp/com/example/demo/arthas/user/UserController.class
- jad命令反编译,然后可以用其它编译器,比如vim来修改源码
- mc命令来内存编译修改过的代码
- 用redefine命令加载新的字节码
基于Attach机制实现的热更新,更新类需要与原来的类在包名,类名,修饰符上完全一致,否则在classRedefine过程中会产生classname don't match 的异常 。
例如显示这样的报错:redefineClasses exception class redefinition failed: attempted to delete a method.
具体来说,JVM热更新局限总结:
- 函数参数格式不能修改,只能修改函数内部的逻辑
- 不能增加类的函数或变量
- 函数必须能够退出,如果有函数在死循环中,无法执行更新类(笔者实验发现,死循环跳出之后,再执行类的时候,才会是更新类)
推荐阅读
- javascript操作元素
- JavaScript字符串处理方法
- Java中常见的服务器
- 10个JavaScript难点
- 如何控制Java多线程分布到不同的CPU核上去?
- 牛肉怎样炖?才软烂鲜香,老师傅偷偷告诉我,只需一勺它轻松搞定
- Java里的回调机制,你了解过吗?
- 一文看懂mysql数据库备份恢复
- 集合 一文了解 JavaScript 中的 Set
- 一文读懂银行数据架构体系