如何在STS/Eclipse调试模式下查看Target Class代理变量属性?
解决Spring CGLIB代理对象在STS/Eclipse调试中看不到真实属性的问题
针对你遇到的三个问题,我来逐一解答:
1. 是否缺少可查看此类代理变量的插件?
不需要额外安装插件。STS和Eclipse本身就支持调试Spring的CGLIB代理对象,只是默认视图显示的是代理外壳,真实的目标对象藏在代理的回调结构里,需要手动去定位。
2. 是否是操作失误导致?
大概率是调试时没找到正确的入口来查看真实对象,而非操作失误。你看到的SomeClass$$EnhancerBySpringCGLIB$$xxx是Spring生成的CGLIB代理类,它本身不会持有原对象的属性,所有属性值都在被代理的目标实例中。
调试时获取真实对象的两种实用方法:
方法一:通过Spring工具类直接提取
在STS/Eclipse的调试视图里,右键点击代理变量(比如someClass),选择「Inspect」,然后输入以下表达式并执行:org.springframework.aop.framework.AopProxyUtils.getSingletonTarget(someClass)执行后就能直接看到真实的
SomeClass实例及其所有属性值。方法二:手动遍历CGLIB回调结构
展开代理对象的CGLIB$CALLBACK_N属性(通常是CGLIB$CALLBACK_0),找到类型为DynamicAdvisedInterceptor的回调对象,再依次展开它的advised->targetSource->target属性,这里就是真实的目标实例。
3. 有哪些相关资料可供参考?
- Spring官方文档中Scoped Proxies章节:详细解释了Spring为自定义作用域生成代理的原因,以及代理的核心工作机制。
- Spring AOP调试相关内容:里面会涉及代理对象的调试技巧,包括如何在IDE中快速定位目标实例。
- Eclipse/STS官方调试指南:学习如何利用调试视图的表达式求值功能,快速定位深层嵌套的对象。
另外补充一点:你看到代理对象的toString()能返回正确内容是正常现象——Spring的CGLIB代理会把toString()、hashCode()这类通用方法转发给目标对象执行,所以点击变量时能看到真实结果,但代理类本身的属性都是空的,这是CGLIB代理的设计特性导致的。
内容的提问来源于stack exchange,提问作者Andrew Cotton
相关产品推荐
相关产品推荐

