有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在CDI中,有没有一种一次性的方法来获取传递限定符?

在CDI中,有没有一种方法可以调用一个方法来获取注释类型的注释,而这些注释本身是用元注释注释的

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

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

现在假设我正在编写一个扩展,它对@Barney一无所知,但确实知道@Fred,并且希望使用@Fred进行元注释

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

我知道我可以手动完成这项工作(手动浏览图表,获取类的注释,获取它们的注释,等等,直到我检测到有问题的元注释)

然而,我也知道,例如,Weld和其他CDI实现必须已经做了类似的事情来实现拦截器规范,因为拦截器绑定的传递方式基本相同。我常常因为忽略了简洁记录的CDI宇宙中的某些东西而感到内疚;我希望现在是这样


共 (1) 个答案

  1. # 1 楼答案

    我怀疑CDI-API中是否有一个函数可以完成这项工作。对于这些用例,CDI实现(比如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。所以我希望递归不是必需的,简单的检查也可以

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

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

    }