我正在嘗試在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