是否可以在 构建时 中读取注释元素的值?例如,如果我定义了以下注释:
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;
}
}
答案 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。