6

我正在开发一个使用 Java 注释处理 API 生成代码的 Java 程序 ( Dagger )。当我们的程序在 中遇到注解时Foo.java,它会生成Foo$$InjectAdapter.java. 我们使用FilerAPI 来附加Element触发生成代码的来源。

Filer 文档说这是为了帮助增量构建:

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

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

4

1 回答 1

8

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

对不起,我没有。

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

  1. 爪哇:

    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 也是如此。

    所以这是一个很大的不。

  2. Eclipse 编译器:

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

    项目属性 -> Java 编译器 -> 注释处理 -> 勾选“启用项目特定设置”&勾选“启用注释处理”</p>

    这将注释处理委托给 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;
    

    所以这是一个很大的不。

于 2013-06-24T04:10:29.567 回答