Инъекция зависимых от кинжала Android не работает на частных полях
Я новичок в кинжале (хотя у меня есть опыт работы с DI от работы над Java EE WebApps с использованием Weld).
То, что я пытаюсь сделать, - это ввести зависимость в класс. Поле является частным.
Затем кинжал выдает исключение, в котором он не может вводить в личное поле.
В чем причина этого?
В конце концов, можно писать в частные поля, используя отражения, даже на android..
Если я устанавливаю видимость поля на что-то другое, кроме частного, похоже, что инъекция работает.
Ответы
Ответ 1
Создание видимого поля частного поля может не всегда быть тем, что вы хотите. Документация Dagger предлагает следующее:
Ввод конечных полей и частных членов. Для лучшей производительности Кинжал генерирует код. Обходите это с помощью конструктора инъекции.
Вот пример:
private ItemFactoryImpl itemFactory;
private BuildingFactory buildingFactory;
@Inject
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) {
this.itemFactory = itemFactory;
this.buildingFactory = buildingFactory;
}
Ответ 2
Кинжал не может поддерживать частные поля и по-прежнему поддерживает сгенерированные кодом адаптеры (во избежание отражения). Как системы, такие как Guice поддерживают частные поля, они меняют доступ к полю рефлексивно, прежде чем обращаться к ним. Поскольку кинжал генерирует InjectAdapter в том же пакете, что и класс, который должен быть введен, он может получить доступ к дружественным пакетам, защищенным или открытым полям. Он не может получить доступ к закрытым полям.
Один из преимуществ Dagger заключается в том, что он избегает отражения, поэтому использование отражения для обхода видимости поля не является желательной особенностью.
Ответ 3
Просто удалите private
, чтобы установить видимость вашего поля для удобства упаковки.
Кинжал не поддерживает инъекцию в частных полях.