使用arthas通过ognl表达式获得spring bean中使用cglib代理的对象中的非静态字段的值

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表达式。

逐句解析:

  1. #cglibo=@com.xxx.SpringContextUtil@getBean(“targetBeanId”):首先在项目中要定义一个“内应”方法,即通过spring的applicationContext的getBean方法获得容器中的bean对象,并赋值给变量cglibo。
  2. #context=#cglibo.getClass().getDeclaredField(“CGLIB$CALLBACK_0”):使用java的反射机制,拿到cglib代理对象中的“CGLIB$CALLBACK_0”属性。
  3. #context.setAccessible(true):设置“CGLIB$CALLBACK_0”属性的访问权限。
  4. #ct=#context.get(#cglibo):利用java的反射机制,获得“CGLIB$CALLBACK_0”属性的值。并赋值给变量ct。
  5. #adv=#ct.getClass().getDeclaredField(“advised”):使用java的反射机制,拿到ct对象中的“advised”属性。
  6. #adv.setAccessible(true):设置“advised”属性的访问权限。
  7. #target=#adv.get(#ct).getTargetSource().getTarget():利用java的反射机制,获得““CGLIB$CALLBACK_0”属性的值。并赋值给变量target。至此,target就是被CGLIB代理的原始对象。
  8. #target.targetField:获得原始对象的“targetField”属性的值。

使用前准备:

  1. 一个“内应”方法,详见“逐句解析”的第一条。
  2. 将上述步骤中的targetBeanId关键词替换为你要查询的beanId。
  3. 将上述步骤中的targetField关键词替换为你要查询的bean中的目标属性名称。
  4. 将上述步骤使用英文逗号拼接起来,形如“arthas样例命令”语句。
  5. 服务器上安装并启动arthas。
  6. 粘贴你的命令,执行,然后看结果了。

你可能感兴趣的:(日常问题解决积累,spring,java,后端)