2011-01-30 67 views
4

一個簡單的例子:如何在使用反射創建的對象上注入事物?

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注入)?

+1

爲什麼你需要通過反射創建`B`而不是注入? – ColinD 2011-01-30 18:28:44

+0

嗯,我想我簡化了很多例子。 B由工廠創建......工廠知道如何創建無法輕鬆注入的複雜對象:他們都有不同類型的構造函數,爲了使Guice正常工作,我需要使用輔助注入,而不是由Android的Guice版本支持。 – Cristian 2011-01-31 00:43:18

回答

8

注入MembersInjector<B>並用它來注入的B字段和方法:

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

這種方法的最好的部分是可以吉斯對於B提前準備的綁定。如果注入B會出現問題,那麼您會在創建注入器時發現,通常是應用程序啓動。這比Injector.injectMembers()更受歡迎,因爲在調用之前它不會失敗。

2

您可以致電injector.injectMembers(myObject),但我懷疑這是否遵循最佳做法。

0

或者/你可以把它放在DI引擎的控制下,或者把它放在你自己身上,但是很難兼得。

我能想到的唯一方法是告訴DI引擎一個可能使用反射來創建實例的工廠方法。但這是唯一會想到的機制。

相關問題