首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CDI中,是否有一次获得传递资格的方法?

在CDI中,是否有一次获得传递资格的方法?
EN

Stack Overflow用户
提问于 2018-02-01 19:39:01
回答 1查看 89关注 0票数 3

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

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

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

现在,假设我正在编写一个扩展,它不了解@Barney,但了解@Fred,并且希望使用@Fred进行元注释。

我正在寻找一种简单的方式来说:“嘿,BeanManager或其他一些机器,给我所有的Beans,都是用@Fred注释的。”

我知道我可以手动完成这个操作(手动遍历图表,获取类的注释,获取它们的注释,等等,直到我检测到所讨论的元注释)。

但是,我也知道,例如,Weld和其他CDI实现必须这样做才能实现拦截器规范,因为拦截器绑定在很大程度上是传递的。我常常因为忽略了简明扼要的CDI宇宙中的一些东西而感到内疚;我希望现在是这样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-01 22:33:06

我怀疑CDI中是否有一个函数来完成这项工作。对于这些用例,CDI实现(比如Weld)中可能有一些私有的助手类。

但是,下面的小函数应该会告诉您,“要测试的类”是否有注释,而注释又是带有某些内容的注释:

代码语言:javascript
复制
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?比较)

如果需要深入,请小心递归调用,因为这很容易导致堆栈溢出。通常,注释具有元注释“保留”,其中包含有“文档”,而“保留”又有“保留”。所以我希望递归是不必要的,简单的检查也可以。

如果是,应该很容易在您的扩展处使用该函数:

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

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48570496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档