通过Reflection识别JAX-RS上的HTTP谓词

时间:2015-11-11 18:05:16

标签: java reflection annotations jax-rs

我正在编写一些代码来弄清楚用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:我知道这种方法不存在,只是为了说明我在寻找什么。

1 个答案:

答案 0 :(得分:2)

AnnotationClass 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;
}