假设我有简单的注释
@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();
}
但这只适用于我在课堂上对方法使用注释的情况。如果我想在整个班级上使用我的注释,checkUserRoleAnnotation
是null
,因为我的方法没有在代码中用它注释。
如何在注释整个类时访问这些变量?
答案 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;
}
我的功能是:
请注意使用.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方法
之上获取注释