【发布时间】:2014-01-06 15:07:53
【问题描述】:
我正在尝试在 Java 6 中编写注释处理器。我编写了一个示例实现,它在 process 方法中创建了一个新的源文件,它工作正常。
@SupportedAnnotationTypes(value = {"*"})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class BrownfieldAnnotationProcessor extends AbstractProcessor{
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
try {
JavaFileObject f = processingEnv.getFiler().
createSourceFile("in.test.ExtraClass");
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
"Creating " + f.toUri());
Writer w = f.openWriter();
try {
PrintWriter pw = new PrintWriter(w);
pw.println("package in.test;");
pw.println("public class ExtraClass implements TestInterface{");
pw.println(" public void print() {");
pw.println(" System.out.println(\"Hello boss!\");");
pw.println(" }");
pw.println("}");
pw.flush();
} finally {
w.close();
}
} catch (IOException x) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
x.toString());
}
return true;
}
}
但就我而言,我不想创建另一个 java 文件,而是直接生成一个类文件。如何创建一个类文件?我应该使用动态编译器在字符串中编译这个源代码来创建类吗?在那种情况下,我可以直接将类文件存储在文件系统中。的用途是什么 processingEnv.getFiler().createClassFile() 方法?
我尝试用谷歌搜索,但找不到使用这种方法的示例。
【问题讨论】:
-
与具体问题无关,我建议使用 JavaPoet (github.com/square/javapoet) 之类的库来生成代码,而不是硬编码大括号、保留字、分号等内容。
-
Filer.createClassFile(..)在 JDK 1.8(内部版本 1.8.0_121-b13)中被破坏。我已经以多种方式测试过使用它,但它从未奏效。尽管如此,这样的功能对于复制以前生成的文件会很有用,而不是用语句来生成源代码。
标签: java annotations annotation-processing