前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >arthas命令redefine实现Java热更新

arthas命令redefine实现Java热更新

作者头像
FunTester
发布2020-05-18 14:24:15
8470
发布2020-05-18 14:24:15
举报
文章被收录于专栏:FunTesterFunTester

arthas是一个Java开源诊断神器。

今天分享一个非常重要的命令redefine,主要作用是加载外部的.class文件,用来替换JVM已经加载的类,总结起来就是实现了Java的热更新。

redefine在一下几种情况中会失败:1、增加了field;2、增加了method;3、替换正在运行的方法。

前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法。

中间提到了将本地的.class文件上传到服务器的技巧,个人没有采用,如果是要热更新,完全可以利用mc这个命令在服务端编译更新后的代码,然后进行本地替换。

arthas命令redefine实现Java热更新

代码

代码语言:javascript
复制
package com.fun;

import com.fun.frame.SourceCode;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.List;

public class Fun extends SourceCode {

    int[] ss = new int[1024];

    public static Logger logger = getLogger(Fun.class);

    public static void main(String[] args) {
        List<Fun> funs = new ArrayList<>();
        while (true) {
            Fun fun = new Fun();
            funs.add(fun);
            sleep(3000);
            test();
            output(funs.size());
        }

    }

    public static void test() {
        logger.info("成功!!!");
    }


}

  • 调用test()方法会打印日志的,如果是该方法被其他地方调用,修改之后也会生效。

  • 郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。更多原创文章:FunTester原创合集
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • arthas命令redefine实现Java热更新
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档