私有字段上的Android Dagger依赖注入失败

cha*_*ver 16 android dependency-injection dagger

我是匕首的新手(虽然我有使用Weld从事Java EE WebApps的DI经验).

我要做的是将依赖注入类中.这个领域是私人的.

然后Dagger抛出异常声明它不能注入私人领域.

这是什么原因?

毕竟有可能使用反射写入私有字段,即使在android上也是如此.

如果我将字段的可见性设置为非私有,则注入似乎有效.

Chr*_*ber 38

Dagger不支持私有字段,仍然支持代码生成的适配器(以避免反射).像Guice这样的系统支持私有字段的方式是它们在访问之前反射性地改变对字段的访问.由于dagger在与要注入的类相同的包中生成InjectAdapter,因此它可以访问包友好,受保护或公共字段.它无法访问私有字段.

Dagger的优点之一是避免反射,因此使用反射来绕过场可见性并不是一个理想的特征.


小智 20

使私有字段'包可见'可能并不总是您想要的.Dagger文档建议如下:

注入最终字段和私有成员.为了获得最佳性能,Dagger生成代码.通过使用构造函数注入解决此问题.

这是一个例子:

private ItemFactoryImpl itemFactory;
private BuildingFactory buildingFactory;

@Inject
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) {
    this.itemFactory = itemFactory;
    this.buildingFactory = buildingFactory;
}
Run Code Online (Sandbox Code Playgroud)

  • 这适用于可构造类型,但Android操作系统类型(如Activity,Application,Fragment)不是由Android框架构建的,因此在这些情况下仍需要字段注入.但是,如果您可以控制构造函数,这是一个很好的建议. (8认同)