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

时间:2016-03-24 10:08:56

标签: java annotations 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();
}

但这只适用于我在课堂上对方法使用注释的情况。如果我想在整个班级上使用我的注释,checkUserRoleAnnotationnull,因为我的方法没有在代码中用它注释。

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

2 个答案:

答案 0 :(得分:0)

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

// 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. 如果没有,请检查课程级别是否有注释
  3. 如果仍然没有,则返回null
  4. 请注意使用.getSuperclass(),因为.getClass()会返回代理。

    使用示例:

    CheckUserRole annotationClass = (CheckUserRole) getAnnotationClass(CheckUserRole.class, ctx);   
    
    if(annotationClass != null){
        String[] allowedRoles = annotationClass.allowedRoles();
    }
    

答案 1 :(得分:0)

使用:

@Context ResourceInfo resourceInfo;

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

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

之上获取注释