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

标签 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() 方法?

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

最佳答案

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

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

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

Should i use a dynamic compiler to compile this source in string to create the class?

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

关于具有 Filer.createClassFile() 实现的 Java 6 注释处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952897/

相关文章:

java - 跨 Tomcat 上的动态 Web 项目的引用类

java - Spring:基于注释的配置期间@import文件中的引用bean

java - 覆盖基本类型映射的映射

java - 为什么 Velocity "Velocity is not initialized correctly."会出现此错误?

java - Maven/Gradle设置编译环境变量?

java - 在 eclipse 中调试注释处理器

java - java中如何查找并获取字符串内的多个子字符串,以及是否需要正则表达式

Java 错误打开注册表项

java - 我代码中某处的无限循环

Symfony 4 Doctrine 关系,集合不获取数据