版权说明,文章转载自 Spring 笔记-获取被代理的真实类
对一个 Autowired
进来的类调用 getClass
,发现得到的类是: com.xxx.search.provider.service.SearchServiceImpl$$EnhancerBySpringCGLIB$$129db519
,一看就不是正经类。从名字中可以看出,这个是被代理后的类,可能因为这个类被AOP了吧。但是我在反射操作是需要原始的类的信息,要如何得到呢?
org.springframework.aop
下有一个很重要的接口: TargetClassAware
, 这个接口表示目前这个类是被代理的。所以我们可以通过判断一个实例是否是 TargetClassAware
的实例来判断他是否是一个代理类。而且 TargetClassAware
接口提供了 getTargetClass
方法来获取真实类。可以这么用:
1 | if (aInstance instanceof TargetClassAware) { |
不过更推荐的做法是使用 org.springframework.aop.support.AopUtils
提供的 getTargetClass
方法来获取真实类。可以看看其源码:
1 | public static Class<?> getTargetClass(Object candidate) { |
代码首先判断当前类是否是 TargetClassAware
的实现,如果是,调用 getTargetClass
,方法还判断当前类是否是 CglibProxy
,如果是基于 cglib
的代理类,因为是基于继承来实现代理,所以获取父类就是真实类了。