【问题标题】:In CDI, is there a one-shot way to get transitive qualifiers?在 CDI 中,是否有一种一次性的方法来获得传递限定符?
【发布时间】:2018-02-01 19:39:01
【问题描述】:

在 CDI 中是否有一种方法可以调用单个方法,该方法将获取带注释类型的注释,而这些注释本身使用元注释进行注释?

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

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

现在假设我正在编写一个扩展程序,它不知道 @Barney,但知道 @Fred,并且想要处理带有 @Fred 元注释的东西。

我正在寻找一种简单的方式来表达“嘿,BeanManager [或其他一些机器],给我所有的 Beans,它们都带有 @Fred 的元注释。 "

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

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

【问题讨论】:

    标签: java cdi


    【解决方案1】:

    我怀疑 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?比较)

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

    如果是,应该很容易在您的扩展程序中使用该功能:

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

    }

    【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2014-07-20
    • 1970-01-01
    • 2021-12-01
    • 2023-03-17
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多