我正在尝试用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() 方法
我尝试使用Google搜索,但却找不到使用此方法的示例。
答案 0 :(得分:2)
我发现创建类文件而不是源代码文件的原因很少。实际上,这与您在任何情况下都需要手动创建字节码的原因相同。
我认为你很少需要做以上任何一项。如果这真的是你想要做的,你当然应该对the format of class files和字节码有很多了解。你现在基本上会创建某种编译器。
你可以说通过发布预编译类或直接生成bytcode,你可以跳过构建过程中的一个步骤,用户程序将更快地编译。这可能是真的,但我确信速度可以忽略不计。使用源代码并将其传递给文件管理器进行编译会更容易。
我应该使用动态编译器在字符串中编译此源来创建类吗?
不,我认为这里没有优势。如果使用文件管理器创建源代码文件,它将自动编译。如果源代码不是Java,而是要为JVM编译的其他语言,则只需执行此操作。