如何从拦截器访问注解变量
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 上使用我的注释,checkUserRoleAnnotation
是 null
,因为我的方法没有在代码中注释。
如何在注释整个 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;
}
我的功能是:
- 检查方法级别是否有注解
- 如果没有,检查class层是否有注解
- 如果还是不行,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)
在您的方法
之上获取注释
假设我有简单的注释
@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 上使用我的注释,checkUserRoleAnnotation
是 null
,因为我的方法没有在代码中注释。
如何在注释整个 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;
}
我的功能是:
- 检查方法级别是否有注解
- 如果没有,检查class层是否有注解
- 如果还是不行,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) 在您的方法
之上获取注释