CDI中是否有一种方法可以调用单个方法来获取注释类型的注释,这些注释本身是使用元注释注释的?
假设我有一个注释,@Fred
,可以应用于注释类型。我们称之为元注释。
假设我有一个可以应用于类的注释@Barney
。假设@Barney
用元注释@Fred
注释。我们会说任何用@Barney
注释的类都是用@Fred
进行元注释的。
现在假设我正在编写一个不了解@Barney
的扩展,但确实知道@Fred
,并希望使用@Fred
元注释的东西。
我正在寻找一种简单的方式来说“嘿,BeanManager
[或其他一些机器],让我所有的Bean
s都用@Fred
进行元注释。”
我知道我可以手动执行此操作(手动浏览图表,获取类注释,获取注释等等,直到我检测到有问题的元注释)。
但是,我也知道,例如,Weld和其他CDI实现必须做这样的事情才能实现拦截器规范,因为拦截器绑定的传递方式大致相同。我经常在简洁的CDI宇宙中忽略某些东西;我希望现在就是这样。
我怀疑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);
[...]
}
}