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

问题描述 投票:2回答:1

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

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

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

现在假设我正在编写一个不了解@Barney的扩展,但确实知道@Fred,并希望使用@Fred元注释的东西。

我正在寻找一种简单的方式来说“嘿,BeanManager [或其他一些机器],让我所有的Beans都用@Fred进行元注释。”

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

但是,我也知道,例如,Weld和其他CDI实现必须做这样的事情才能实现拦截器规范,因为拦截器绑定的传递方式大致相同。我经常在简洁的CDI宇宙中忽略某些东西;我希望现在就是这样。

java cdi
1个回答
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);
        [...]
    }

}

© www.soinside.com 2019 - 2024. All rights reserved.