版权说明,文章转载自 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 的代理类,因为是基于继承来实现代理,所以获取父类就是真实类了。