Java 6注释处理器,带有Filer.createClassFile()实现

时间:2014-01-06 15:07:54

标签: java annotations annotation-processing

我正在尝试用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搜索,但却找不到使用此方法的示例。

1 个答案:

答案 0 :(得分:2)

我发现创建类文件而不是源代码文件的原因很少。实际上,这与您在任何情况下都需要手动创建字节码的原因相同。

我认为你很少需要做以上任何一项。如果这真的是你想要做的,你当然应该对the format of class files和字节码有很多了解。你现在基本上会创建某种编译器。

你可以说通过发布预编译类或直接生成bytcode,你可以跳过构建过程中的一个步骤,用户程序将更快地编译。这可能是真的,但我确信速度可以忽略不计。使用源代码并将其传递给文件管理器进行编译会更容易。

  

我应该使用动态编译器在字符串中编译此源来创建类吗?

不,我认为这里没有优势。如果使用文件管理器创建源代码文件,它将自动编译。如果源代码不是Java,而是要为JVM编译的其他语言,则只需执行此操作。