• 使用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. 粘贴你的命令,执行,然后看结果了。
  • 相关阅读:
    java.lang.Float类下toString()方法具有什么功能呢?
    java中的悲观锁和乐观锁
    三、Selenium IDE
    设计模式之生产者/消费者模式
    编译一个基于debian/ubuntu,centos,arhlinux第三方系统
    vue echart详细使用说明
    Go[Golang]语言学习实践[回顾]教程01--为何选择学习使用Go语言
    Linux i2ctool 工具的使用方法
    漏洞危害
    QWebEngine图片渲染性能优化
  • 原文地址:https://blog.csdn.net/u011924665/article/details/126901159