在 CDI 中,是否有一次性获得传递限定符的方法?



CDI中有没有办法调用单个方法,该方法将获取注释类型的注释,这些注释本身是用元注释注释的?

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

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

现在假设我正在编写一个扩展,它对@Barney一无所知,但确实知道@Fred,并且想要处理用@Fred元注释的东西。

我正在寻找一种简单的方法来说"嘿,BeanManager[或其他一些机器],给我所有用@Fred元注释Bean

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

但是,我也知道,例如,Weld 和其他 CDI 实现必须已经执行类似操作才能实现拦截器规范,因为拦截器绑定以大致相同的方式传递。 我经常因为忽略了记录在简明的 CDI 世界中的某些东西而感到内疚;我希望现在情况是这样。

我怀疑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 比较 - 如何从注释中获取注释?

如果需要更深入,请小心递归调用,因为这很容易导致堆栈溢出。通常,注释具有元注释@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);
[...]
}

}

最新更新