作者:拉斯维加斯的单身派对_101 | 来源:互联网 | 2023-02-10 18:04
我正在研究一个使用Java注释处理API生成代码的Java程序(Dagger).当我们的程序在Foo.java中遇到注释时,它会生成Foo$$InjectAdapter.java.
我正在研究一个使用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;
所以这是一个很大的问题.