java – Filer的原始元素是否有用?

我正在研究一个使用Java注释处理API生成代码的Java程序(Dagger).当我们的程序在Foo.java中遇到注释时,它会生成Foo $$InjectAdapter.java.我们使用Filer API来附加触发生成代码的原始元素.

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

“This information may be used in an incremental environment to determine the need to rerun processors or remove generated files. Non-incremental environments may ignore the originating element information.”

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

最佳答案

Does anyone know of an incremental environment that use this information?

对不起,我没有.

Does javac or the Eclipse compiler use this information?

> 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.processing或originatingElements – 即根本不使用新的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;

所以这是一个很大的问题.

转载注明原文:java – Filer的原始元素是否有用? - 代码日志