我正在编写一些代码来弄清楚用JAX-RS
实现的类的元数据,我正在编写一个方法,它接受Method
并返回与该方法相关的HTTP Verb,基本上弄清楚是否它使用@POST
,@GET
,@PUT
或@DELETE
进行注释。
我现在拥有的是:
private static String extractHttpVerb(Method method) {
if(method.getAnnotation(GET.class) != null) {
return "GET";
} else if (method.getAnnotation(POST.class) != null) {
return "POST";
} else if (method.getAnnotation(PUT.class) != null) {
return "PUT";
} else if (method.getAnnotation(DELETE.class) != null){
return "DELETE";
} else {
return "UNKNOWN";
}
}
它工作正常,但我发现所有这些注释都使用@HttpMethod
注释,并且value
的名称为String。例如:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("POST")
@Documented
public @interface POST {
}
所以我在想。有没有办法让我从Method
的引用中找出它是否由注释注释,而注释又注释了另一个特定的注释?
类似的东西:
boolean annotated = method.hasAnnotationsAnnotatedBy(HttpMethod.class);
PS:我知道这种方法不存在,只是为了说明我在寻找什么。
答案 0 :(得分:2)
Annotation
由Class
es表示,就像任何其他对象一样。就像Method
s一样,可以反映Class
以检查注释。例如
Annotation anno = method.getAnnotation(...);
Class<? extends Annotation> cls = anno.annotationType();
boolean annotHasAnnotation = cls.isAnnotationPresent(...);
要将所有这些组合成一个方法,您可以执行以下操作,这仍然需要您遍历方法上的所有注释
public static boolean hasSuperAnnotation(Method method, Class<? extends Annotation> check) {
for (Annotation annotation: method.getAnnotations()) {
if (annotation.annotationType().isAnnotationPresent(check)) {
return true;
}
}
return false;
}
[...]
boolean hasHttpMethod = hasSuperAnnotation(method, HttpMethod.class);
如果你要做的是清理你的方法,你可以做类似
的事情public static String extractHttpVerb(Method method) {
for (Annotation annotation: method.getAnnotations()) {
if (annotation.annotationType().isAnnotationPresent(HttpMethod.class)) {
return annotation.annotationType().getSimpleName();
}
}
return null;
}