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

带有Filer.createClassFile()实现的Java 6注释处理器,java,annotations,annotation-processing,Java,Annotations,Annotation Processing,我正在尝试用Java6编写一个注释处理器。我编写了一个示例实现,它在process方法中创建了一个新的源文件,效果很好 @SupportedAnnotationTypes(value = {"*"}) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class BrownfieldAnnotationProcessor extends AbstractProcessor{ public boolean process(Set

我正在尝试用Java6编写一个注释处理器。我编写了一个示例实现,它在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;
}
@SupportedAnnotationTypes(值={“*”})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
公共类BrownfieldAnnotationProcessor扩展了AbstractProcessor{

公共布尔过程(Set我只看到创建类文件而不是源代码文件的几个原因。实际上,这就是为什么在任何情况下都需要手动创建字节码的原因

  • 您绝对需要控制字节码(可能出于“优化”或测试目的)
  • 你需要使用
我认为你很少需要做上面的任何一项。如果这是你真正想要做的,你当然应该知道很多关于字节码和字节码的知识。在这一点上,你基本上是在创建某种编译器

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

是否应该使用动态编译器以字符串形式编译此源代码以创建类


不,我看不出这有什么好处。如果你用文件管理器创建一个源代码文件,它将自动编译。如果你的源代码不是Java,而是你想为JVM编译的其他语言,你只需要这样做。

是的,同意。现在创建了src文件而不是类文件。与具体问题无关,我建议使用像javapoter()这样的库可以生成代码,而不是硬编码,如花括号、保留字、分号等。
Filer.createClassFile(…)
在JDK1.8(build 1.8.0_121-b13)中被破坏。我已经用很多方法测试过它,但它从来都不起作用。不过,这样的功能对于复制以前生成的文件,而不是通过声明来生成源代码是有用的。