Java获取CGLIB代理类上的注解为null的问题

 

一、场景

搭建框架的时候踩到的一个坑。spring boot项目,项目中用到了AOP记录Log,又用到了拦截器判断权限和记录系统log到表中,于是在拦截器中需要
HandlerMethod handlerMethod = (HandlerMethod) handler;获取类注解和方法注解,但是获取的类注解是null,源码如下:

 // 获取类注解
Class<? extends Object> clazz = handlerMethod.getBean().getClass();
CategoryLog categoryLog = AnnotationUtils.findAnnotation(clazz, CategoryLog.class);
if (Objects.isNull(categoryLog)) {
     return;
}
String menu = categoryLog.menu();
// 获取方法注解
Method method = handlerMethod.getMethod();
DescLog descLog = method.getAnnotation(DescLog.class);
if (Objects.isNull(descLog)) {
     return;
}
二、原因分析

是由于上述代码我们所需要获取的类首先被AOP拦截生成了代理对象。我是debug发现clazz对象是个代理对象可知的,如下图。
Java获取CGLIB代理类上的注解为null的问题_踩坑之路
上图可知,是cglib代理后的对象(默认是jdk的,我在application.yml里手动指定的cglib),那么我们获取代理对象的注解信息肯定是获取不到的,需要获取原始对象才能拿到注解等信息。

三、解决方案

通过org.springframework.core.annotation.AnnotationUtils注解提供的findAnnotation方法即可完美解决问题,代码在上面已经给到了。用clazz.getAnnotation(CategoryLog.class);这种方式是获取不到的,获取的是代理对象的,为null。

四、广告

 
Java获取CGLIB代理类上的注解为null的问题_踩坑之路_02