-
Notifications
You must be signed in to change notification settings - Fork 7.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【Arthas问题排查集】活用ognl表达式 #11
Comments
Very nice, :-) |
感受到了强大 |
请教一下,watch命令支持,多参数,有响应,针对某个string参数进行条件过滤监控吗? 如果支持的话,具体脚本怎么写呢 |
eg. 说明:
参考: |
使用 |
😄👍👍 |
请教在调用方法时,如果参数是 Class 类型,应该如何传入 |
|
如何给一个静态变量赋值呢? |
|
👍 |
请问多个过滤表达式怎么写呢? |
怎么解决的? |
logger --name ROOT --level debug |
logger --name ROOT --level debug |
niubility |
ognl list 过滤的例子
|
👍 |
1 similar comment
👍 |
厉害 |
收下我的膝盖👍👍👍👍 |
关于数组的遍历,你举的例子有点误导人... 后来看了阿里云的文档:
才知道其实正确的数组投影用法是: list.{property} |
在 jdk11 环境下,
run watch with ognl expression to call interface static method will failed.
with error info
|
Very powerful! |
请教各大佬个问题: |
前言
Arthas 3.0中使用ognl表达式替换了groovy来实现表达式的求值功能,解决了groovy潜在会出现内存泄露的问题。灵活运用ognl表达式,能够极大提升问题排查的效率。
ognl官方文档:https://commons.apache.org/proper/commons-ognl/language-guide.html
一个测试应用
查看第一个参数
params是参数列表,是一个数组,可以直接通过下标方式访问
查看数组中的元素
第一个参数是一个List,想要看List中第一个Pojo对象,可以通过下标方式,也可以通过List的get方法访问。
查看Pojo的属性
拿到这个Pojo可以,直接访问Pojo的属性,如age
还可以通过下标的方式访问
params[0][0]["age"]
,这个写法等效于params[0][0].age
:但这样会报错,这时候需要再加一个引号
集合投影
有时候我们只需要抽取对象数组中的某一个属性,这种情况可以通过投影来实现,比如要将Pojo对象列表中的name属性单独抽出来,可以通过
params[0].{name}
这个表达式来实现。 ognl会便利params[0]这个List取出每个对象的name属性,重新组装成一个新的数组。用法相当于Java stream中的map函数。集合过滤
有时候还需要针对集合对象按某种条件进行过滤,比如想找出所有age大于5的Pojo的name,可以这样写
其中
{? #this.age > 5}
相当于stream里面的filter,后面的name
相当于stream里面的map那如果要找到第一个age大于5的Pojo的name,怎么办呢?可以用
^
或$
来进行第一个或最后一个的匹配,像下面这样:多行表达式
有些表达式一行之内无法表达,需要多行才能表达,应该怎么写的?比如,假设我们要把所有Pojo的name拿出来,再往里面新加一个新的元素,在返回新的列表,应该如何写?可以通过中括号将多个表达式串联起来,最后一个表达式的返回值代表整个表达式的最终结果。临时变量可以用
#
来表示。调用构造函数
调用构造函数,必须要指定要创建的类的
全类名
。比如下面的例子中,创建一个新的list,然后添加一个新的元素,然后返回添加后的list。访问静态变量
可以通过
@class@filed
方式访问,注意需要填写全类名调用静态方法
可以通过
@class@method(args)
方式访问,注意需要填写全类名静态方法和非静态方法结合,例如想要获取当前方法调用的TCCL,可以像下面这样写:
访问Map中的元素
Test.n是一个HashMap,假设要获取这个Map的所有key,ongl针对Map接口提供了
keys
,values
这两个虚拟属性,可以像普通属性一样访问。因为这个Map的Key是一个Enum,假设要把key为RUN这个值的value取出来应该怎么写呢?可以通过Enum的
valueOf
方法来创建一个Enum,然后get出来,比如下面一样或者是下面这样,通过迭代器+过滤的方式:
附录: ognl内置的ognl的虚拟属性
最后
欢迎在留言区分享你的牛逼用法,互相交流进步~
The text was updated successfully, but these errors were encountered: