Java 如何在使用反射创建的对象上注入内容?
一个简单的例子:Java 如何在使用反射创建的对象上注入内容?,java,guice,code-injection,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(){
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!!!
}
}
所以,我的问题是:如果我使用反射(而不是通过Guice注入)创建了B对象,我如何才能使注入工作呢?你可以调用
injector.injectMembers(myObject)
,但我怀疑这是否符合最佳实践。或者:你可以将其置于DI引擎的控制之下,或者自己处理,但两者都要很难
我能想到的唯一方法是告诉DI引擎一个可能使用反射创建实例的工厂方法。但这是我想到的唯一机制。注入
成员对象并使用它注入B
的字段和方法:
class A {
@Inject A(MembersInjector<B> bInjector) {
...
B b = constructor.newInstance();
bInjector.injectMembers(b);
b.doSomething();
}
}
A类{
@注入(MembersInjector-bInjector){
...
B=构造函数.newInstance();
b注射者。注射者成员(b);
b、 doSomething();
}
}
这种方法最好的部分是Guice可以提前为B准备绑定。如果注入B时出现问题,您将在创建注入器时发现问题,这通常是应用程序启动。这比Injector.injectMembers()
更可取,因为它在被调用之前不会失败。为什么需要通过反射创建B
,而不是让它被注入?我想我简化了很多示例。B是由一家工厂创建的。。。工厂知道如何创建无法轻松注入的复杂对象:它们都有不同类型的构造函数,为了使Guice正常工作,我需要使用辅助注入,这是Android版Guice不支持的。