
arthas简介请参考java 诊断工具--arthas,或移步arthas官网。arthas中很多命令都能使用到ognl,为了方便练习,特选用 watch 命令来练习,官方文档: https://alibaba.github.io/arthas/ognl.html 。
用例项目xw-mail( https://gitee.com/xzbd/xw-mail ),用例接口为用户列表代码如下,入参是params(map),出参是java对象PageUtil,相关代码如下:
@GetMapping("/list")@ResponseBodyPageUtils list(@RequestParam Map params) { // 查询列表数据 Query query = new Query(params); List sysUserList = userService.list(query); int total = userService.count(query); PageUtils pageUtil = new PageUtils(sysUserList, total); return pageUtil; }
图1-PageUtil代码
准备好环境,启动项目xw-mail和arthas。

图2-准备好环境
使用命令监控用户列表的list方法的参数,访问后如下图所示:

从图上看出监控到的 params 被封装在一个object数组中,数组中的元素依然是map。注意:arthas命令watch的参数params并不是要与监控方法llst定义的参数名params相同,这里只是巧合。arthas命令watch命令使用的params是自己内置的,类似的参数还有throwExp,returnObj,详细见官方文档 https://alibaba.github.io/arthas/watch.html 。
- ognl 自定义变量:将参数自定义为变量p

- 获得数组的大小

- 判断数字大小,并做处理(三元运算符)

- 获取数组中第n个元素:取自定义变量p中的第一个元素

- 获取map中的元素:取limit的值

- 获取方法返回值

监控 list 方法的返回值,可以看到返回的是PageUtils,属性 total 和 rows 。因为设置了 -x 3 ,所以UserDo也格式化输出了。
- 获取对象属性(取第一个对象的 name 值)


ognl 命令相关:
- 自定义数组
# 定义数组【“xzbd”,"abcd"】,判断是否存在 "xzbd",并打印出结果[arthas@26209]$ ognl -x 2 "#value={'xzbd','abcd'}, {'xzbd' in #value} ? 'yes':'no' "@String[yes]- 查看静态属性值
# ognl 因为classloader的原因,失败,[arthas@31486]$ ognl "@com.xzbd.common.config.Constant@DEMO_ACCOUNT"# 参考文章 https://cloud.tencent.com/developer/article/1531452# 使用过 getstatic 能成功[arthas@31486]$ getstatic "com.xzbd.common.config.Constant" "LOG_ERROR"field: LOG_ERROR@String[error]Affect(row-cnt:1) cost in 6 ms.- 调用静态方法
ognl '#val=@java.lang.System@currentTimeMillis()'@Long[1578733049112]

被折叠的 条评论
为什么被折叠?



