6

我正在尝试使用 java 编写注释处理器。该注释处理器需要识别注释类中的注释嵌套类,如下所示。我将首先处理带注释的类,然后处理它们的内部注释。这是在编译时执行的,我将不知道正在处理的类。Foo 中可以有多个嵌套类。如何处理所有这些嵌套类的注释。

@MyAnnotation(value="Something important")
public class Foo
{
    private Integer A;

    @MyMethodAnnotation(value="Something Else")
    public Integer getA() { return this.A; }

    @MyAnnotation(value="Something really important")
    private class Bar
    {
        private Integer B;

        @MyMethodAnnotation(value="Something Else that is very Important")
        public Integer getB() { return this.B }     
    }
}

如何在处理过程中访问嵌套的 Bar 类、注释“MyAnnotation”及其“MyMethodAnnotation”?下面的代码只打印出关于类 Foo 的信息。如何处理有关 Bar 的信息?

for (Element element : env.getElementsAnnotatedWith(MyAnnotation.class)) {
    if ( element.getKind().equals(ElementKind.CLASS) )
    {
        System.out.println(element.getKind().name() + " " + element.getSimpleName() );
        processInnerClassElement(element);
    }
    else
    {
        System.out.println(element.getKind().name() + " " + element.getSimpleName() );
    }    
}

...


private void processInnerClassElement(Element element)
{
    for (Element e : element.getEnclosedElements() )
    {
        if ( e.getKind().equals(ElementKind.CLASS) )
        {
            System.out.println(e.getKind().name() + " " + e.getSimpleName() );
            processInnerClassElement(e);
        }
        else
        {
            System.out.println(e.getKind().name() + " " + e.getSimpleName()  );
        }
    }
}
4

2 回答 2

1

我想这取决于这些注释如何相互关联。

您可以简单地在 @SupportedAnnotationTypes 中声明所有注释,并在流程方法中有几个块,例如:

for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
    MyAnnotation myAnnotation = element.getAnnotation(MyAnnotation.class);
    if (myAnnotation != null) {
        doSomething(myAnnotation, element);
    }
}

for (Element element : roundEnv.getElementsAnnotatedWith(MyMethodAnnotation.class)) {
    MyMethodAnnotation myMethodAnnotation = element.getAnnotation(MyMethodAnnotation.class);
    if (myMethodAnnotation != null) {
        doSomething(myMethodAnnotation, element);
    }
}

否则,您可能能够使用element.getEnclosedElements()element.getEnclosingElement()实现您想要的。

于 2012-10-11T23:14:34.403 回答
-1

您将需要一些方法ClassMethod执行此操作,特别是获取在 中声明的Foo类、这些类上的注释、这些类中声明的方法以及这些方法上的注释。这是一个简单的例子:

public static void main(String... args) {
    for (Class<?> declaredClass : Foo.class.getDeclaredClasses()) {
        MyAnnotation myAnnotation = declaredClass.getAnnotation(MyAnnotation.class);
        // Process value of class annotation here
        for (Method method : declaredClass.getDeclaredMethods()) {
            MyMethodAnnotation myMethodAnnotation = method.getAnnotation(MyMethodAnnotation.class);
            // Process value of method annotation here
        }
    }
}

阅读有关 Java 反射的文档可能会很有见地:http: //docs.oracle.com/javase/tutorial/reflect/index.html

于 2012-10-11T20:02:15.527 回答