Arthas执行在线代码

arthas 是阿里巴巴开源的一款监控诊断的神器,能实时监测应用内存、gc、线程的状态信息,并查看方法调用的出入参、异常,监测方法执行耗时等信息 1。这篇文章中我们将借助 arthas 提供的 ognl 命令来执行在线代码。

安装

安装 arthas 很简单,只需要从官网下载并运行即可。

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

选择所需要使用的程序,即会进入 arthas 的控制台。

如果碰到中文乱码,可以使用下面方式启动 arthas:

java -Dfile.encoding=UTF-8 -jar arthas-boot.jar

使用

ognl 命令能用于执行 ognl 表达式,但是需要获取类的 ClassLoader。所以关键在于获取类所在的 ClassLoader。为此准备了一个例子来讲解。

public class ArthasTest {  
    private static final ArthasTest instance = new ArthasTest();  
    private static List<Integer> staticList = Arrays.asList(1, 2);  
    private List<Integer> instanceList = Arrays.asList(3, 4);  
  
    public ArthasTest() {  
    }  
  
    public static ArthasTest getInstance() {  
        return instance;  
    }  
  
    public static String testStatic() {  
        return "执行方法testStatic()成功";  
    }  
  
    public String testInstance() {  
        return "执行方法testInstance()成功";  
    }  
}

执行静态方法:

[arthas@14892]$ ognl -x 3 '@com.example.springstartertest.test.t2022.ArthasTest@testStatic()'
@String[执行方法testStatic()成功]

获取静态属性:

[arthas@14892]$ ognl -x 3 '@com.example.springstartertest.test.t2022.ArthasTest@staticList'
@ArrayList[
    @Integer[1],
    @Integer[2],
]

获取单例类。需要先获取实例对象,再执行实例方法:

[arthas@14892]$ ognl -x 3 '#ins=@com.example.springstartertest.test.t2022.ArthasTest@getInstance(),#ins.testInstance()'
@String[执行方法testInstance()成功]

获取单例类中的实例属性:

[arthas@14892]$ ognl -x 3 '#ins=@com.example.springstartertest.test.t2022.ArthasTest@getInstance(),#ins.instanceList'
@ArrayList[
    @Integer[3],
    @Integer[4],
]

对于 Spring 应用程序,则可以通过 Spring context 获取实例的 Bean2
需要先增加一个类来获取 Spring context:

@Component  
public class ApplicationContextProvider implements ApplicationContextAware {  
    private static ApplicationContext context;  
  
    public ApplicationContext getApplicationContext() {  
        return context;  
    }  
  
    @Override  
    public void setApplicationContext(ApplicationContext ctx) {    
        context = ctx;  
    }  
}

测试类:

@Service("ArthasTest2")  
public class ArthasTest2 {  
  
    public String run() {  
        return "执行方法run()成功";  
    }  
}

调用 spring 管理的 bean 的方法:

[arthas@6648]$ ognl -x 3 '#springContext=@com.example.springstartertest.ApplicationContextProvider@context,#springContext.getBean("ArthasTest2").run()'
@String[执行方法run()成功]

对于 IDEA 用户来说,可以通过安装 “arthas idea” 插件,在指定方法或属性的位置右键直接获取 arthas 命令。在这里插入图片描述


  1. 简介 | arthas ↩︎

  2. GitHub - WangJi92/arthas-idea-plugin: arthas idea plugin 更简单的使用arthas的IDEA 插件,方便的构建各种arthas 命令,复制到剪切板 然后到服务器上启动arthas 执行命令。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值