我对 Java 注释处理上下文中的增量环境到底是什么感到困惑。一个例子是高度赞赏的。
以下是Filer的 Javadoc 的引用:
文件创建方法采用可变数量的参数,以允许将原始元素作为提示提供给工具基础架构,以更好地管理依赖关系。原始元素是导致注释处理器尝试创建新文件的类型或包(表示包信息文件)。例如,如果注释处理器尝试创建源文件 GeneratedFromUserSource,以响应处理
@Generate public class UserSource {}
UserSource 的 type 元素应作为创建方法调用的一部分传递,如下所示:
filer.createSourceFile("GeneratedFromUserSource", eltUtils.getTypeElement("UserSource"));
如果没有原始元素,则不需要传递。此信息可在增量环境中用于确定是否需要重新运行处理器或删除生成的文件。非增量环境可能会忽略原始元素信息。
我理解,例如,在上面的例子中,如果@Generated
被删除,那么下次运行编译时,之前生成的GeneratedFromUserSource
将被删除。(据推测,显然,一些实现com.sun.tools.javac.processing.JavacFiler
完全忽略了原始元素。)这是否使它成为增量?我没有任何需要重新运行处理器的例子。
为了让事情更混乱,我偶然发现了这个问题,显然,有三种类型的处理器:
- 动态,2. 隔离,3. 聚合
并且增量处理器需要在 META-INF 中与非增量处理器不同的位置注册。我目前正在使用@AutoService
我认为不支持此注册的。
由于(大多数情况下)不允许覆盖Filer
,我希望能澄清一下是什么使处理器增量。