gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:09:49 25 4
gpt4 key购买 nike

假设我有简单的注释

@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,因为我的方法没有在代码中使用它进行注释。

当整个类都被注释时,如何访问这些变量?

最佳答案

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

// 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

注意使用.getSuperclass(),因为.getClass()返回代理。

使用示例:

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

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

关于java - 如何从拦截器访问注释变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36197607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com