一文搞定Java热更新( 二 )


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

  1. jad命令反编译,然后可以用其它编译器,比如vim来修改源码
  2. mc命令来内存编译修改过的代码
  3. 用redefine命令加载新的字节码
JVM热更新的局限
基于Attach机制实现的热更新,更新类需要与原来的类在包名,类名,修饰符上完全一致,否则在classRedefine过程中会产生classname don't match 的异常 。
例如显示这样的报错:redefineClasses exception class redefinition failed: attempted to delete a method.
具体来说,JVM热更新局限总结:
  1. 函数参数格式不能修改,只能修改函数内部的逻辑
  2. 不能增加类的函数或变量
  3. 函数必须能够退出,如果有函数在死循环中,无法执行更新类(笔者实验发现,死循环跳出之后,再执行类的时候,才会是更新类)
最后,限于笔者经验水平有限,欢迎读者就文中的观点提出宝贵的建议和意见 。如果想获得更多的学习资源或者想和更多的技术爱好者一起交流,可以关注我的公众号『全菜工程师小辉』后台回复关键词领取学习资料、进入前后端技术交流群和程序员副业群 。




推荐阅读