【发布时间】:2012-11-21 07:59:55
【问题描述】:
我正在尝试编写annotation processor 以在类中插入方法和字段...而且文档非常稀少。我没有走远,我不知道我是否正确地接近它。
处理环境提供了一个Filer 对象,该对象具有创建新源文件和类文件的便捷方法。这些工作正常,但后来我试图弄清楚如何读取现有的源文件,它提供的只是“getResource”。所以在我的处理器实现中我已经这样做了:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
}
}
} catch (Exception e) {
e.printStackTrace();
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
}
return true;
}
我的第一个困惑是我不禁觉得element.asType().toString().replace(".", "/") + ".java"(获取限定类型名称并将其转换为包和源文件路径)不是解决问题的好方法。 API 的其余部分设计过度,但似乎没有一种方便的方法来检索原始源代码。
真正的问题是编译器会自发地被输出目录中的第二个源文件(“错误:重复类”)弄乱,现在我被卡住了。
我已经编写了剩下的部分——一个宏词法分析器和解析器以及诸如此类的东西,用于计算一些数据并插入字段值和方法——但它作为编译器之外的初始步骤运行。除了原始文件不能具有 .java 扩展名(以防止编译器看到它们)这一事实之外,这很好用。然后听说注解可以做代码生成,我觉得会比较合适和方便,但是找不到太多的指导。
【问题讨论】:
标签: java code-generation annotation-processing