我是新來的匕首(儘管我有使用Weld的Java EE WebApps的工作經驗)。Android Dagger依賴注入在私人領域失敗
我想要做的是向類中注入一個依賴項。該領域是私人的。
匕首然後拋出一個異常,說明它不能注入私人領域。
這是什麼原因?
畢竟這是可以編寫使用反射,即使在Android的私有字段..
如果我設置領域的知名度,其他的東西比私人注射似乎工作。
我是新來的匕首(儘管我有使用Weld的Java EE WebApps的工作經驗)。Android Dagger依賴注入在私人領域失敗
我想要做的是向類中注入一個依賴項。該領域是私人的。
匕首然後拋出一個異常,說明它不能注入私人領域。
這是什麼原因?
畢竟這是可以編寫使用反射,即使在Android的私有字段..
如果我設置領域的知名度,其他的東西比私人注射似乎工作。
製作一個私人領域「包可見」可能並不總是你想要的。匕首文檔建議如下:
注入最終字段和私人成員。爲獲得最佳性能 Dagger生成代碼。通過使用構造函數 注入解決此問題。
下面是一個例子:
private ItemFactoryImpl itemFactory;
private BuildingFactory buildingFactory;
@Inject
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) {
this.itemFactory = itemFactory;
this.buildingFactory = buildingFactory;
}
只是刪除private
設置您的字段的可見性包裝友好。
匕首不支持注入專用字段。
匕首不能支持專用字段,仍然支持代碼生成的適配器(以避免反射)。像Guice這樣的系統支持私人領域,他們在訪問領域之前會反射性地改變對領域的訪問。由於匕首在與要注入的類相同的包中生成InjectAdapter,因此它可以訪問軟件包友好的,受保護的或公共的字段。它不能訪問私人領域。
Dagger的優點之一就是避免了反射,所以使用反射繞過場可視性並不是一個理想的功能。
對我來說很有意義。將此標記爲正確答案。謝謝 ! –
隨時。 :)隨時也可以投票。 ;) –
不錯,謝謝你的輸入。構造函數注入是我習慣於與CDI一起工作的東西.. –
這適用於可構造類型,但Activity,Application,Fragment等Android OS類型不打算由除Android框架之外的任何東西構造,因此字段注入仍然是在這些情況下需要。但是,如果您對構造函數有控制權,這是一個很好的建議。 –