Java 从CDI托管bean获取方法的注释

Java 从CDI托管bean获取方法的注释,java,jakarta-ee,cdi,Java,Jakarta Ee,Cdi,我想从方法中检索注释(自定义编写的注释)。通常我可以通过访问 class.getMethod("methodName").getAnnotation("annotationName") 但是如果bean由CDI容器管理(我使用的是OpenWebBeans),那么类在运行时会得到增强。然后我必须使用超类来请求注释。目前,我试图通过在类名中查找“$$”来检测是否管理该类。但对我来说,这似乎是一个非常肮脏的解决方案 有什么好方法可以从CDI管理的bean中检索注释吗 具体来说,我的代码是这样的: 我

我想从方法中检索注释(自定义编写的注释)。通常我可以通过访问

class.getMethod("methodName").getAnnotation("annotationName")
但是如果bean由CDI容器管理(我使用的是OpenWebBeans),那么类在运行时会得到增强。然后我必须使用超类来请求注释。目前,我试图通过在类名中查找“$$”来检测是否管理该类。但对我来说,这似乎是一个非常肮脏的解决方案

有什么好方法可以从CDI管理的bean中检索注释吗

具体来说,我的代码是这样的: 我创建了一个注释“Coolnessfactor”来标记一个非常酷的方法:-)

通过枚举CoolnessValue,我想指定方法实现有多酷

public enum CoolnessValue {
    POOR, VERY_COOL, UNBELIEVABLE;
}
然后,我在我的商业类中标记了不同的方法,注释fe:

@Override
@Coolnessfactor(CoolnessValue.POOR)
public void getSingleObjectWithDetails(final Integer techId) {
    return this.dao.findCompleteDataByPrimaryKey(techId);
}
现在我想分析标注不同方法的注释的值。我必须在CDI装饰器中完成,因此我不能使用拦截器绑定

目前,我的方法是使用反射API检索注释值:

public static <A extends Annotation> Map<String, A> getAnnotatedMethodsOfClass(final Class<?> clazz,
        final Class<A> annotationClazz) {
    final Map<String, A> annotationMap = new HashMap<String, A>();
    Method[] declaredMethods;
    if (clazz.getName().contains("$$")) {
        declaredMethods = clazz.getSuperclass().getDeclaredMethods();
    } else {
        declaredMethods = clazz.getDeclaredMethods();
    }
    for (final Method m : declaredMethods) {
        if (m.isAnnotationPresent(annotationClazz)) {
            annotationMap.put(m.getName(), m.getAnnotation(annotationClazz));
        }
    }
    return annotationMap;
}
公共静态映射getAnnotatedMethodsOfClass(最终类clazz,
最终类注释(clazz){
final Map annotationMap=新HashMap();
方法[]公布方法;
如果(clazz.getName()包含($$)){
declaredMethods=clazz.getSuperclass().getDeclaredMethods();
}否则{
declaredMethods=clazz.getDeclaredMethods();
}
对于(最终方法m:公布方法){
如果(m.isAnnotationPresent(annotationClazz)){
put(m.getName(),m.getAnnotation(annotationClazz));
}
}
返回注释图;
}

但我觉得这很糟糕。尤其是对CDI实现增强的类的检测非常糟糕。

也许可以使用
BeanManager尝试它-您将希望使用它来获取bean的实例。根据bean的类型,这里的方法有所不同。仔细浏览API并找到自己的方法


一旦你获得了
Bean
,你就应该能够使用
getBeanClass()
,并且通过它你可以访问方法和它们的注释。

也许可以尝试使用
BeanManager
-你会想使用它来获得你的Bean实例。根据bean的类型,这里的方法有所不同。仔细浏览API并找到自己的方法


一旦你得到
Bean
你就应该能够使用
getBeanClass()
,这样你就可以访问方法和它们的注释了。

你能提供更多关于你想要实现什么的细节吗?这些对你有用吗?你想用CDIBean上的注释实现什么?也许(胡乱猜测)CDI拦截器会更合适?很抱歉没有足够详细。我在问题中添加了更多的代码细节。我不知道BeanManager在这种情况下是否能帮助我。我试图浏览API,但没有发现任何真正有用的东西。你能提供更多关于你想要实现什么的细节吗?对你有用吗?你想通过CDIBean上的注释实现什么?也许(胡乱猜测)CDI拦截器会更合适?很抱歉没有足够详细。我在问题中添加了更多的代码细节。我不知道BeanManager在这种情况下是否能帮助我。我试图浏览API,但没有发现任何真正有用的东西。
public static <A extends Annotation> Map<String, A> getAnnotatedMethodsOfClass(final Class<?> clazz,
        final Class<A> annotationClazz) {
    final Map<String, A> annotationMap = new HashMap<String, A>();
    Method[] declaredMethods;
    if (clazz.getName().contains("$$")) {
        declaredMethods = clazz.getSuperclass().getDeclaredMethods();
    } else {
        declaredMethods = clazz.getDeclaredMethods();
    }
    for (final Method m : declaredMethods) {
        if (m.isAnnotationPresent(annotationClazz)) {
            annotationMap.put(m.getName(), m.getAnnotation(annotationClazz));
        }
    }
    return annotationMap;
}