【问题标题】:Java 6 annotation processor with Filer.createClassFile() implementation带有 Filer.createClassFile() 实现的 Java 6 注释处理器
【发布时间】:2014-01-06 15:07:53
【问题描述】:

我正在尝试在 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() 方法?

我尝试用谷歌搜索,但找不到使用这种方法的示例。

【问题讨论】:

  • 与具体问题无关,我建议使用 JavaPoet (github.com/square/javapoet) 之类的库来生成代码,而不是硬编码大括号、保留字、分号等内容。
  • Filer.createClassFile(..) 在 JDK 1.8(内部版本 1.8.0_121-b13)中被破坏。我已经以多种方式测试过使用它,但它从未奏效。尽管如此,这样的功能对于复制以前生成的文件会很有用,而不是用语句来生成源代码。

标签: java annotations annotation-processing


【解决方案1】:

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

我认为您很少需要执行上述任何操作。如果这真的是你想要做的,你当然应该对the format of class files 和字节码有很多了解。此时您基本上会创建某种编译器。

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

我应该使用动态编译器将这个源代码编译成字符串来创建类吗?

不,我认为这里没有优势。如果您使用文件管理器创建源代码文件,它将自动编译。仅当您的源代码不是 Java 而是要为 JVM 编译的其他语言时,您才需要这样做。

【讨论】:

  • 是的,同意。现在创建了 src 文件而不是类文件。
猜你喜欢
  • 2011-04-14
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多