Arthas--ognl表达式

本文介绍了如何使用Arthas的OGNL命令来执行表达式,获取JVM对象的数据。示例包括调用静态方法、处理返回值、传入不同类型参数以及指定ClassLoader等。同时展示了通过OGNL操作复杂对象如Map和引用变量的方法。还提到了通过ClassLoader的hashcode或类名来定位对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

arthas执行ognl表达式,获取对应的jvm对象数据。ognl学习,可以查看上篇:https://xiaopanjia.blog.csdn.net/article/details/130425414

基本语法

ognl express -c {hashCode} --classLoaderClass {当前的全路径 ClassLoader 信息} -x {number}

参数说明

参数名称参数说明
express执行的表达式
[c:]执行表达式的 ClassLoader 的 hashcode,默认值是 SystemClassLoader
[classLoaderClass:]指定执行表达式的 ClassLoader 的 class name
[x]结果对象的展开层次,默认值 1

例如:

1、调用静态方法, 简单入参 返回普通对象

ognl '@com.shirc.arthasexample.ognl.OgnlTest@getPerson("src",18)' -X 1

2、方法A的返回值当做方法B的入参, 执行多行表达式,赋值给临时变量,返回一个List

ognl '#value1=@com.shirc.arthasexample.ognl.OgnlTest@getPerson("src",18),
#value2=@com.shirc.arthasexample.ognl.OgnlTest@setPerson(#value1),{#value1,#value2}' -x 2

3、方法入参是简单类型列表

ognl '@com.shirc.arthasexample.ognl.OgnlTest@getChilds({"test1","test2"})' -x 2

4、方法入参是一个复杂对象

ognl '#obj=new com.shirc.arthasexample.ognl.Shirc("test1",'test2'),
@com.shirc.arthasexample.ognl.OgnlTest@inputObj(#obj)' -x 2

5、方法入参是一个Map对象

ognl '#inputmap=#{ "foo" : "foo value", "bar" : "bar value" }, 
@com.shirc.arthasexample.ognl.OgnlTest@getMap(#inputmap)' -x 2

6、
#变量引用
引用变量的方法是在变量名之前加上
#this 当前对象
OGNL在计算表达式的过程中, 随时会将当前对象保存在 "this"变量中, 这个变量也可以象其他任何变量一样引用,用 #this 表示当前对象

例如:
shirc: 是map的key; 记得要用双引号"" 引起来

ognl '@com.shirc.arthasexample.ognl.OgnlTest@getMap()["shirc"].
(#this.sex=="boy"?"BoyNB":"GirlNB")' -x 2

7、 通过 hashcode 指定 ClassLoader:

$ classloader -t
+-BootstrapClassLoader
+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@301ec38b
  +-com.taobao.arthas.agent.ArthasClassloader@472067c7
  +-jdk.internal.loader.ClassLoaders$AppClassLoader@4b85612c
    +-org.springframework.boot.loader.LaunchedURLClassLoader@7f9a81e8

$ ognl -c 7f9a81e8 @org.springframework.boot.SpringApplication@logger
@Slf4jLocationAwareLog[
    FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog],
    name=@String[org.springframework.boot.SpringApplication],
    logger=@Logger[Logger[org.springframework.boot.SpringApplication]],
]

对于只有唯一实例的 ClassLoader 可以通过 class name 指定,使用起来更加方便:

$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader  @org.springframework.boot.SpringApplication@logger
@Slf4jLocationAwareLog[
    FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog],
    name=@String[org.springframework.boot.SpringApplication],
    logger=@Logger[Logger[org.springframework.boot.SpringApplication]],
]

参考

【Arthas】命令之ognl使用姿势 - 腾讯云开发者社区-腾讯云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值