如何在使用反射创建的对象上注入东西?

时间:2011-01-30 16:49:27

标签: java guice code-injection

一个简单的例子:

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 个答案:

答案 0 :(得分:8)

注入MembersInjector<B>并使用它来注入B的字段和方法:

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

这种方法最好的部分是Guice可以提前准备B的绑定。如果注入B会出现问题,你会发现创建注入器的时间,通常是应用程序启动。这比Injector.injectMembers()更受欢迎,因为在调用它之前不会失败。

答案 1 :(得分:2)

您可以致电injector.injectMembers(myObject),但我怀疑这是否遵循最佳做法。

答案 2 :(得分:0)

要么/或者:你可以将它置于DI引擎的控制之下或自己接受它,但是很难同时拥有它们。

我能想到的唯一方法是告诉DI引擎一个可能使用反射来创建实例的工厂方法。但这是唯一可以想到的机制。