- 编译出 reloader.jar
- java项目本体启动时添加启动参数
-javaagent: reloader.jar
会额外启动一个rmi服务,端口暂定为9999 - 热更时,将新编译出的本体程序用解压软件打开(如7z)删除掉没有更新的class文件,只保留有更新的class文件
- 将删减后的jar包命名为
hotdeploy.jar
(或使用-deploy参数传入自定义名称) - 执行
java -jar reload.jar -rmiHost 127.0.0.1 -rmiPort 9999 [-deploy hotdeploy.jar]
javaagent会将本体的Instrumentation
对象传入agent
调用Instrumentation
的redefineClasses
方法即可更新class
反射调用ClassLoader
的defineClass
方法即可新增class
使用时需要用rmi找到本体的jvm实例
更新的class不能新增方法和变量,不能修改方法签名