gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:18 26 4
gpt4 key购买 nike

我正在尝试用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com