我正在使用Java注释处理API生成代码的Java程序(Dagger)。当我们的程序在Foo.java中遇到注释时,它将生成Foo$$InjectAdapter.java。我们使用 Filer API附加触发触发生成代码的原始Element

Filer文档说,这旨在帮助增量构建:

“此信息可用于增量环境中,以确定需要重新运行处理器或删除生成的文件。非增量环境可能会忽略原始元素信息。”

有谁知道使用此信息的增量环境? javac或Eclipse编译器是否使用此信息?

最佳答案

有谁知道使用此信息的增量环境?

对不起,我没有。

javac或Eclipse编译器是否使用此信息?

  • javac:

    javac的内部注释处理环境使用javax.annotation.processing.Filer实现类com.sun.tools.javac.processing.JavacFiler。以下是此类的相关代码段:
    public JavaFileObject createSourceFile(CharSequence paramCharSequence,
                                           Element[] paramArrayOfElement) throws IOException {
        return createSourceOrClassFile(true, paramCharSequence.toString());
    }
    

    即,它只是丢弃原始元素,而不以任何方式使用它们。

    对createClassFile和createResourceFile也是如此。

    所以没有。
  • Eclipse编译器:

    在Eclipse中,您可以通过以下方式启用Java 6样式的注释处理:

    项目属性-> Java编译器->注释处理->选中“启用项目特定设置”并选中“启用注释处理”

    这将注释处理委托给JDT-Core内部编译器,后者使用注释处理自己的实现。 Eclipse 4.2、3.7和3.6源代码不包含字符串javax.annotation.processingoriginatingElements-即完全不使用新的Java 6注释处理API。在搜索Filer时,我们看到它使用了旧的jdk-5风格的Filer接口:

    org.eclipse.jdt.apt.core.internal.env.BuildFilerImpl扩展
    org.eclipse.jdt.apt.core.internal.env.FilerImpl,该实现
    com.sun.mirror.apt.Filer

    所有这些都具有方法签名:
    PrintWriter createSourceFile(String name) throws IOException;
    OutputStream createClassFile(String name) throws IOException;
    PrintWriter createTextFile(Location loc, String pkg, File relPath, String charsetName) throws IOException;
    OutputStream createBinaryFile(Location loc, String pkg, File relPath) throws IOException;
    

    所以没有。
  • 10-07 16:09