如何从拦截器访问注解变量

How to access annotation variables from interceptor

假设我有简单的注释

@InterceptorBinding 
@Retention(RUNTIME) @Target({TYPE, METHOD})
public @interface CheckUserRole {
    @Nonbinding String[] allowedRoles() default "";
}

接下来,我有这样定义的拦截器:

@Interceptor
@CheckUserRole
public class CheckUserRoleInterceptor

如何从注释访问 allowedRoles?我是这样做的:

CheckUserRole checkUserRoleAnnotation = ctx.getMethod().getAnnotation(CheckUserRole.class);

if(checkUserRoleAnnotation != null){
     String[] allowedRoles = checkUserRoleAnnotation.allowedRoles();
}

但这只有在我 class 中的方法上使用注释时才有效。如果我想在整个 class 上使用我的注释,checkUserRoleAnnotationnull,因为我的方法没有在代码中注释。

如何在注释整个 class 时访问这些变量?

我找到了解决这个问题的好方法。要从方法或 class 访问注释(如果方法级别没有注释)只需使用我的函数:

// Returns annotation from method or class (if does not exist, returns null)
@SuppressWarnings({ "unchecked", "rawtypes" })
protected Object getAnnotationClass(Class clazz, InvocationContext ctx){
    Object annotationClass = ctx.getMethod().getAnnotation(clazz);

    // Try to find annotation on class level
    if(annotationClass == null){
        annotationClass = ctx.getTarget().getClass().getSuperclass().getAnnotation(clazz);
    }

    return annotationClass;
}

我的功能是:

  1. 检查方法级别是否有注解
  2. 如果没有,检查class层是否有注解
  3. 如果还是不行,return null

注意使用 .getSuperclass() 因为 .getClass() return 代理。

用法示例:

CheckUserRole annotationClass = (CheckUserRole) getAnnotationClass(CheckUserRole.class, ctx);   

if(annotationClass != null){
    String[] allowedRoles = annotationClass.allowedRoles();
}

使用:

@上下文 ResourceInfo 资源信息;

在您的拦截器 class.With ResourceInfo 对象中,您将能够获得关联的 class 以及方法(和其他有用的信息)。

之后使用 Annotationabc abc = resourceInfo.getResourceMethod().getAnnotation(Annotationabc .class) 在您的方法

之上获取注释