在CDI中是否有一种方法可以调用单个方法来获取注释类型的注释,而这些注释本身就是用元注释进行注释的?
假设我有一个注释@Fred,它可以应用于注释类型。我们称之为元注释。
进一步假设我有一个注释,@Barney,它可以应用于一个类。假设@Barney是用元注释@Fred注释的。我们会说,任何用@Barney注释的类都是用@Fred注释的。
现在,假设我正在编写一个扩展,它不了解@Barney,但了解@Fred,并且希望使用@Fred进行元注释。
我正在寻找一种简单的方式来说:“嘿,BeanManager或其他一些机器,给我所有的Beans,都是用@Fred注释的。”
我知道我可以手动完成这个操作(手动遍历图表,获取类的注释,获取它们的注释,等等,直到我检测到所讨论的元注释)。
但是,我也知道,例如,Weld和其他CDI实现必须这样做才能实现拦截器规范,因为拦截器绑定在很大程度上是传递的。我常常因为忽略了简明扼要的CDI宇宙中的一些东西而感到内疚;我希望现在是这样的。
发布于 2018-02-01 22:33:06
我怀疑CDI中是否有一个函数来完成这项工作。对于这些用例,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?比较)
如果需要深入,请小心递归调用,因为这很容易导致堆栈溢出。通常,注释具有元注释“保留”,其中包含有“文档”,而“保留”又有“保留”。所以我希望递归是不必要的,简单的检查也可以。
如果是,应该很容易在您的扩展处使用该函数:
class MyExtension implements Extension {
<T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
Class<?> annotatedTypeClass = pat.getAnnotatedType().getJavaClass();
boolean result = isBuddyOf(Fred.class, annotatedTypeClass);
[...]
}}
https://stackoverflow.com/questions/48570496
复制相似问题