2

プログラムの実行中に構成ファイルを読み取り、ソースコードからクラスを生成するファクトリがあります。

新しく生成されたクラスを 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);
4

1 に答える 1

1

生成されたクラスに注入可能なコンストラクターがある場合は、Injector.getInstance(Class<T>)を使用できます。

于 2013-07-19T22:41:46.757 に答える