执行的方法或者类有自定义注解,但是通过clazz.getAnnotation取值为null
UnAuthRequest annotation = clazz.getAnnotation(UnAuthRequest.class);
原因是Spring AOP使用CGLIB生成的代理是不会加上父类的方法上的注解的
所以试着获取了一下super
UnAuthRequest annotation = clazz.getSuperclass().getAnnotation(UnAuthRequest.class);
果然拿到了自定义的注解,Annotation有一个工具类,可以比较方便的从类中拿到Annotation
这样用:
AnnotationUtils.findAnnotation(clazz, UnAuthRequest.class)
这个方法的源码先从类中获取,再从父类中获取
@Nullable
public static <A extends Annotation> A findAnnotation(Class<?> clazz, @Nullable Class<A> annotationType) {
if (annotationType == null) {
return null;
} else if (!AnnotationFilter.PLAIN.matches(annotationType) && !AnnotationsScanner.hasPlainJavaAnnotationsOnly(clazz)) {
return (Annotation)MergedAnnotations.from(clazz, SearchStrategy.TYPE_HIERARCHY, RepeatableContainers.none()).get(annotationType).withNonMergedAttributes().synthesize(MergedAnnotation::isPresent).orElse((Object)null);
} else {
A annotation = clazz.getDeclaredAnnotation(annotationType);
if (annotation != null) {
return annotation;
} else {
Class<?> superclass = clazz.getSuperclass();
return superclass != null && superclass != Object.class ? findAnnotation(superclass, annotationType) : null;
}
}
}
所以使用这个方法就OK了
import org.springframework.core.annotation.AnnotationUtils;
AnnotationUtils.findAnnotation(Class<?> clazz, @Nullable Class<A> annotationType)