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