在批注处理期间是否可以使用Mirror API递归检查批注

时间:2018-12-25 05:35:05

标签: java annotations code-generation annotation-processing

假设我有一个像这样的类结构:

@MyAnnotationOne
class A { 
    private String id;
    private B b;

    public static class B {
        private C c;

        @MyAnnoationOne
        public static class C {
            @MyAnnotationTwo
            private String annotatedString;
        }
    }
}

我正在使用注释处理来生成代码。如果我正在处理@MyAnnotationOne,则可以使用Mirror API获得A类和C类中的所有字段。

我想知道是否可以找到类A中沿层次结构向下包含注解@MyAnnotationOne或@MyAnnotationTwo的任何字段。找到任何一个就足够了。

我试图寻找一种解决方案,但是我发现有人说,由于注释处理发生在预编译阶段,因此该信息可能不可用。如果您有任何解决方案,请告诉我。这将是很大的帮助。

1 个答案:

答案 0 :(得分:0)

您可以配置注释是否保留在运行时中。您可以使用java.lang.annotation.Retention元注释来注释自己的注释类型,并指定枚举java.lang.annotation.RetentionPolicy中的值之一。

  

RUNTIME注释由编译器记录在类文件中,并在运行时由VM保留,以便可以通过反射方式读取。

     

CLASS注释由编译器记录在类文件中,但VM在运行时无需保留。

     

SOURCE批注将被编译器丢弃。

编辑 如果要构建注释处理器:

  • 您的代码在该(预)编译阶段正在运行,因此所有注释都应存在。
  • 不赞成使用镜像API,请参见javax.lang.model...javax.annotation.processing

如果您覆盖javax.annotation.processing.AbstractProcessor.process(),则会收到RoundEnvironment,其中包含用于获取模型Element的方法,包括通过特定注释类型过滤的集合。给定Element后,您可以getEnclosedElements()并在这些getAnnotation(annotationType)上。