我正在尝试在Java 6中编写注释处理器。我编写了一个示例实现,它在流程方法中创建了一个新的源文件,并且工作正常。具有Filer.createClassFile()实现的Java 6注释处理器
@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() 方法的用法是什么?
我试过Google搜索,但无法找到使用此方法的示例。
与具体问题无关,我建议使用像JavaPoet这样的库(https://github.com/square/javapoet)来生成代码,而不是像大括号,保留字,分号等硬编码。 – jpangamarca
' Filer.createClassFile(..)'在JDK 1.8(build 1.8.0_121-b13)中被破坏。我已经用很多方式测试过它,它从来没有用过。尽管如此,这样的功能对于复制以前生成的文件非常有用,而不是使用语句来生成源文件。 – mljrg