Как внедрить вещи в объекты, которые были созданы с помощью отражения? - PullRequest
4 голосов
/ 30 января 2011

Простой пример:

class C{}

class B{
    @Inject C c;
    void doSomething(){
         System.out.println(c);
    }
}

class A{
    @Inject A(B b){
        b.doSomething();//this works fine and prints the c object
    }
}

Теперь, если я создам объект B, используя отражение:

class A{
     A(){
         // blah blah blah 
         B b = constructor.newInstance();
         b.doSomething(); // sigh, this prints null!!!
     }
}

Итак, мой вопрос: как я могу заставить инъекцию работать, если я создал объект B с помощью отражения (а не инъекции через Guice)?

Ответы [ 3 ]

8 голосов
/ 31 января 2011

Введите MembersInjector<B> и используйте его для ввода полей и методов B:

class A {
    @Inject A(MembersInjector<B> bInjector) {
        ...
        B b = constructor.newInstance();
        bInjector.injectMembers(b);
        b.doSomething();
    }
}

Лучшая часть этого подхода состоит в том, что Guice может подготовить привязки для B заранее.Если возникнут проблемы с инъекцией B, вы узнаете, когда создадите инжектор, обычно это запуск приложения.Это предпочтительнее, чем Injector.injectMembers(), потому что это не сработает, пока не будет вызвано.

2 голосов
/ 30 января 2011

Вы можете позвонить injector.injectMembers(myObject), но я сомневаюсь, что это следует передовой практике.

0 голосов
/ 30 января 2011

Либо /, либо: вы можете поставить его под контроль двигателя DI или взять его на себя, но трудно иметь и то, и другое.фабричный метод, который может использовать отражение для создания экземпляра.Но это единственный механизм, который приходит на ум.

...