arthas样例命令:
ognl ‘#cglibo=@com.xxx.SpringContextUtil@getBean(“targetBeanId”,#context=#cglibo.getClass().getDeclaredField(“CGLIB$CALLBACK_0”),#context.setAccessible(true),#ct=#context.get(#cglibo),#adv=#ct.getClass().getDeclaredField(“advised”),#adv.setAccessible(true),#target=#adv.get(#ct).getTargetSource().getTarget()#target.targetField’
ognl是执行OGNL表达式的关键词。下面逐句解析ognl表达式。
逐句解析:
- #cglibo=@com.xxx.SpringContextUtil@getBean(“targetBeanId”):首先在项目中要定义一个“内应”方法,即通过spring的applicationContext的getBean方法获得容器中的bean对象,并赋值给变量cglibo。
- #context=#cglibo.getClass().getDeclaredField(“CGLIB$CALLBACK_0”):使用java的反射机制,拿到cglib代理对象中的“CGLIB$CALLBACK_0”属性。
- #context.setAccessible(true):设置“CGLIB$CALLBACK_0”属性的访问权限。
- #ct=#context.get(#cglibo):利用java的反射机制,获得“CGLIB$CALLBACK_0”属性的值。并赋值给变量ct。
- #adv=#ct.getClass().getDeclaredField(“advised”):使用java的反射机制,拿到ct对象中的“advised”属性。
- #adv.setAccessible(true):设置“advised”属性的访问权限。
- #target=#adv.get(#ct).getTargetSource().getTarget():利用java的反射机制,获得““CGLIB$CALLBACK_0”属性的值。并赋值给变量target。至此,target就是被CGLIB代理的原始对象。
- #target.targetField:获得原始对象的“targetField”属性的值。
使用前准备:
- 一个“内应”方法,详见“逐句解析”的第一条。
- 将上述步骤中的targetBeanId关键词替换为你要查询的beanId。
- 将上述步骤中的targetField关键词替换为你要查询的bean中的目标属性名称。
- 将上述步骤使用英文逗号拼接起来,形如“arthas样例命令”语句。
- 服务器上安装并启动arthas。
- 粘贴你的命令,执行,然后看结果了。