我编写了一个AnnotationProcessor
来扫描代码以获取某个注释,并从中生成一个Java类。
它基本上是这样的:
private Multimap<String, Element> elements;
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Factory.class)) {
elements.put(annotatedElement.getSimpleName());
}
generateCode(elements);
}
以防万一:
generateCode()
将迭代elements
,这是一个多图,并为每个键创建一个类(键+ SUFFIX是我想要生成的文件的名称),其中包含根据列表信息创建的代码与键相关联的元素(某个键的mulitimap的值)。
显然,我会在每一轮注释处理中调用generateCode()
。因此,我将收到一个编译错误,指出在上一轮中已经生成了同名文件。
处理这个问题的正确方法是什么?我认为收集所有注释并仅在最后一轮生成类是一个好主意,如下所示:
private Multimap<String, Element> elements;
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Factory.class)) {
elements.put(annotatedElement.getSimpleName());
}
if (roundEnv.processingOver()){
generateCode(elements);
}
}
这解决了多次生成同一文件的问题,但现在我收到以下警告:
警告:java:上一轮创建的类型[生成的java文件的路径]的文件不受注释处理。
javadoc声明你不应该在上一轮中生成代码。 我什么时候应该生成我的文件?
此外,如果我点击重建项目,我也会在IntelliJ 14中收到此警告: 警告:输出路径[生成的java文件的路径]与源根相交。只清理由build创建的文件。