注释 - 在构建时读取元素值

时间:2011-06-15 13:12:08

标签: java annotations

是否可以在 构建时 中读取注释元素的值?例如,如果我定义了以下注释:

public @interface State {
    String stage();
}

我在类中注释了一个方法,如下所示:

public class Foo {
   @State(stage = "build")
   public String doSomething() {
      return "doing something";
   }
}

如何在构建时,在注释处理器中阅读@State注释元素“stage”的 ?我有一个如下构建的处理器:

@SupportedAnnotationTypes(value = {"State"})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class StageProcessor extends AbstractProcessor { 
    @Override
    public boolean process(Set<? extends TypeElement> elementTypes,
            RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getRootElements()) {
               // ... logic to read the value of element 'stage' from
               // annotation 'State' in here.
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:6)

不是最好的答案,因为我自己没有这样做,但看到已经3个小时,我会尽我所能。

  

注释处理概述

     

除非注释处理   使用-proc:none选项禁用,   编译器搜索任何   注释处理器   可用。搜索路径可以是   使用-processorpath指定   选项;如果没有给出,用户   使用类路径。处理器是   通过服务定位   名为
的provider-configuration文件   META-INF /服务/ javax.annotation.processing.Processor   在搜索路径上。这样的文件应该   包含任何注释的名称   要使用的处理器,每个列出一个   线。或者,处理器可以   明确指定,使用    - 处理器选项。

因此,您需要在javax.annotation.processing.Processor文件夹中创建一个名为META-INF/services的文件,该文件列出了注释处理器的名称,每行一个。

编辑:那么我相信阅读注释的代码就像......

    for (Element element : roundEnv.getRootElements()) {
        State state = element.getAnnotation(State.class);
        if(state != null) {
            String stage = state.stage();
            System.out.println("The element " + element + " has stage " + stage);
        }
    }

可以找到注释处理器的真实示例here