Подтвердить что ты не робот

Инъекция зависимых от кинжала Android не работает на частных полях

Я новичок в кинжале (хотя у меня есть опыт работы с DI от работы над Java EE WebApps с использованием Weld).

То, что я пытаюсь сделать, - это ввести зависимость в класс. Поле является частным.

Затем кинжал выдает исключение, в котором он не может вводить в личное поле.

В чем причина этого?

В конце концов, можно писать в частные поля, используя отражения, даже на android..

Если я устанавливаю видимость поля на что-то другое, кроме частного, похоже, что инъекция работает.

4b9b3361

Ответ 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, чтобы установить видимость вашего поля для удобства упаковки.

Кинжал не поддерживает инъекцию в частных полях.