我是匕首的新手(虽然我有使用Weld从事Java EE WebApps的DI经验)。
我要做的是将依赖注入类中。这个领域是私人的。
然后,Dagger抛出一个异常,说明它无法注入私有字段。这是什么原因?
毕竟有可能使用反射写入私有字段,即使在android ..
如果我将该字段的可见性设置为非私有,则注入似乎有效。
答案 0 :(得分:37)
Dagger不支持私有字段,仍然支持代码生成的适配器(以避免反射)。像Guice这样的系统支持私有字段的方式是它们在访问之前反射性地改变对字段的访问。由于dagger在与要注入的类相同的包中生成InjectAdapter,因此它可以访问包友好,受保护或公共字段。它无法访问私有字段。
Dagger的优点之一是它避免了反射,因此使用反射来绕过场可见性并不是一个理想的特征。
答案 1 :(得分:19)
使私有字段'包可见'可能并不总是您想要的。 Dagger文档建议如下:
注入最终字段和私人成员。为了最好的表现 Dagger生成代码。通过使用构造函数解决此问题 注射。
以下是一个例子:
private ItemFactoryImpl itemFactory;
private BuildingFactory buildingFactory;
@Inject
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) {
this.itemFactory = itemFactory;
this.buildingFactory = buildingFactory;
}
答案 2 :(得分:2)
只需移除private
即可将字段的可见性设置为包友好。
Dagger不支持在私人领域注射。