在CDI中,是否有一种获取传递限定符的方法?

时间:2018-02-01 19:39:02

标签: java cdi

CDI中是否有一种方法可以调用单个方法来获取注释类型的注释,这些注释本身是使用元注释注释的?

假设我有一个注释@Fred,可以应用于注释类型。我们称之为元注释。

假设我有一个可以应用于类的注释@Barney。假设@Barney使用元注释@Fred进行注释。我们会说任何使用@Barney注释的类都是带有@Fred的元注释

现在假设我正在编写一个不知道@Barney的内容的扩展程序,但确实知道@Fred,并希望处理带有元注释的内容与@Fred

我正在寻找简单的方式来说"嘿,BeanManager [或其他一些机制],让我全部Bean使用@Fred进行元注释。"

我知道我可以手动执行此操作(手动浏览图表,获取课程注释,获取注释等等,直到我检测到有问题的元注释)。

然而,我也知道,例如,Weld和其他CDI实现必须已经做了类似的事情来实现拦截器规范,因为拦截器绑定在传递方式上大致相同。我经常在简洁的CDI世界中忽略某些东西;我希望现在就是这样。

1 个答案:

答案 0 :(得分:0)

我怀疑CDI-API上有一个功能可以完成这项工作。对于这些用例,CDI-Implementations(如Weld)中可能存在一些私有帮助类。

但是下面的小函数应该告诉你“要测试的类”是否有一个注释,它再次是注释:

private static boolean isBuddyOf(
        final Class<? extends Annotation> annotation,
        final Class<?> classToTest) {
    return Stream.of(classToTest.getAnnotations())
            .anyMatch(a -> a.annotationType().isAnnotationPresent(annotation));
}

(与JAVA - How to get annotations from Annotation?比较)

如果你需要更深入,请小心递归调用,因为这很容易导致堆栈溢出。通常,注释具有Meta-Annotation @Retention,其具有@Documented,其再次具有@Retention。所以我希望递归不是必要的,简单的检查就可以了。

如果是,在您的分机上使用该功能应该很容易:

class MyExtension implements Extension {
    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
        Class<?> annotatedTypeClass = pat.getAnnotatedType().getJavaClass();
        boolean result = isBuddyOf(Fred.class, annotatedTypeClass);
        [...]
    }

}