gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:37:30 24 4
gpt4 key购买 nike

CDI 中是否有一种方法可以调用单个方法,该方法将获取本身使用元注释进行注释的注释类型的注释?

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

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

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

我正在寻找一种简单的方式来表达“嘿,BeanManager [或其他一些机器],给我所有的Bean@Fred 进行元注释。”

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

不过,我也知道,例如,Weld 和其他 CDI 实现必须已经做类似的事情来实现拦截器规范,因为拦截器绑定(bind)以几乎相同的方式传递。我经常因为忽略了简洁记录的 CDI 世界中的某些东西而感到内疚;我希望现在就是这种情况。

最佳答案

我怀疑 CDI-API 中是否有一个函数可以完成这项工作。对于这些用例,CDI 实现(如 Weld)中可能有一些私有(private)帮助程序类。

但是下面的小函数应该告诉你“要测试的类”是否有一个注解,这个注解又是带有一些东西的注解:

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? 比较)

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

关于java - 在 CDI 中,是否有一次性获得传递限定符的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48570496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com