Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用反射创建的对象上注入内容?_Java_Guice_Code Injection - Fatal编程技术网

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不支持的。