プログラムの実行中に構成ファイルを読み取り、ソースコードからクラスを生成するファクトリがあります。
新しく生成されたクラスを Guice に渡し、そこからインスタンスを作成するにはどうすればよいですか。通常の AbstractModule が Guice に渡される時点では、クラスは不明です。
アイデア?解決?
編集: 問題は、ウィジェットの実装がオンザフライでコンパイルされ (ファイルが変更された場合は常に最新)、それ自体が Guice を介して自動的に提供される必要があることです。AbstractModule の例は次のようになります。
public class MyModule extends AbstractModule {
protected void configure() {
bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
... more bindings
}
@Provider
public Widget provideWidget(){
Class<Widget> clazz = ModuleCompiler.compile("src/WidgetImpl.java");
// Clazz is a widget. But we do not know the exact constructors
// We need to now produce a fully injected Instance as-if it was bound
// like in a "bind(Widget.class).to(clazz)" statement
// in the configure() method
return (fully created injected class)
}
}
完全な答え:
わかりました...タビアンは道を示しました。これは、インジェクターが構成モジュールで (インジェクションによって) 取得された場合に機能し、次のように新しく作成されたクラスをインジェクトできます。
class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Config.class).toInstance(Config.getInstance());
}
@Provides
public Widget provideWidget(Injector injector) throws Exception {
Class<Widget> c = ModuleCompiler.compile("src/WidgetImpl.java");
return injector.getInstance(c);
}
}
MyModule module = new MyModule();
Injector injector = Guice.createInjector(module);
Widget w = injector.getInstance(Widget.class);