3

Square的AssitedInject库实际上是一个生成Dagger 2模块的注释处理器。Dagger 2 也是一个注释处理器。

而且据我所知,没有办法控制处理器执行的顺序

在此示例中(请参见下面的代码段),您可以看到模块依赖于由 AssistedInject 生成的类AssistedInject_MainModule。因此,如果 Dagger 2 将首先运行,则构建应该会失败,因为此时AssistedInject_MainModule不存在。

但是可以编译。它是如何工作的?

@AssistedModule 
@Module(includes = AssistedInject_MainModule.class) 
public abstract class MainModule { 
    @Provides static @Exclamation String provideExclamation() {
        return "!"; 
    } 
}
4

1 回答 1

0

据我所知,没有办法控制处理器执行的顺序。

我没有研究 Dagger 2 或 AssistedInject 如何在幕后工作,但通常注释处理是在多轮中完成的。

注释处理发生在一系列轮次中。在每一轮中,可能会要求处理器处理在前一轮生成的源文件和类文件中找到的注释子集。

在这些轮次中生成文件,但验证(和错误)发生在稍后或最后一轮,当每个文件都被生成和处理时。在您链接的问题的第二个答案中也提到了这一点。有人还写了一个关于轮次如何处理不同问题的详细答案。

于 2018-12-16T16:45:30.560 回答