使用arthas命令redefine实现Java热更新(推荐)
arthas是一个Java开源诊断神器。
今天分享一个非常重要的命令redefine,主要作用是加载外部的.class文件,用来替换JVM已经加载的类,总结起来就是实现了Java的热更新。
redefine在一下几种情况中会失败:1、增加了field;2、增加了method;3、替换正在运行的方法。
前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法。
中间提到了将本地的.class文件上传到服务器的技巧,个人没有采用,如果是要热更新,完全可以利用mc这个命令在服务端编译更新后的代码,然后进行本地替换。
arthas命令redefine实现Java热更新
代码
packagecom.fun;
importcom.fun.frame.SourceCode;
importorg.slf4j.Logger;
importjava.util.ArrayList;
importjava.util.List;
publicclassFunextendsSourceCode{
int[]ss=newint[1024];
publicstaticLoggerlogger=getLogger(Fun.class);
publicstaticvoidmain(String[]args){
Listfuns=newArrayList<>();
while(true){
Funfun=newFun();
funs.add(fun);
sleep(3000);
test();
output(funs.size());
}
}
publicstaticvoidtest(){
logger.info("成功!!!");
}
}
调用test()方法会打印日志的,如果是该方法被其他地方调用,修改之后也会生效。
到此这篇关于使用arthas命令redefine实现Java热更新(推荐)的文章就介绍到这了,更多相关arthasJava热更新内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!