如何在javax.lang.model.element TypeElement中模拟getDeclaredAnnotation

时间:2019-01-23 18:38:44

标签: java annotations annotation-processing

我正在编写一个注释处理器,并且具有@Inherited的注释“ a”。 这意味着,对于表示类“ c”的任何元素“ e”,如果元素“ e”扩展了实际存在我的注释的类,我将得到e.getAnnotation(a.class) != null为真-很好,这是期望。

我还能够通过以下方式确定在其上实际显示我的注释的层次结构中的最高级别:

private TypeElement getClassWhereAnnotationIsActuallyDefined(TypeElement e){
    if(e.getAnnotation(a.class) == null){
        throw new IllegalArgumentException("method called on type: "+e.getQualifiedName().toString()+" which is not annotated @a !");
    }
    TypeElement superE = (TypeElement) processingEnv.getTypeUtils().asElement(e.getSuperclass());
    if(superE.getAnnotation(Secured.class) == null){
        return e;
    }else{
        return getClassWhereAnnotationIsActuallyDefined(superE);
    }
}

但是我无法获得确定在给定元素上我是否实际声明了注释的功能,该功能将与层次结构中具有注释存在的多个类一起工作(显然,使用Java反射和类的名义上的getDeclaredAnnotations方法)。

// edit:我今天不再考虑了,所以也许这一点很明显,但是能够检测出注释是否在层次结构中被声明了一次以上,这甚至会有所帮助。甚至不确定是否要允许它。

1 个答案:

答案 0 :(得分:0)