注入与Guice一起编译的类

时间:2013-07-19 19:28:27

标签: java class dynamic dependency-injection guice

我有一个工厂,它读取配置文件,并在程序运行时从源代码生成一个Class。

如何将新生成的类传递给Guice并让它从中创建一个实例。在将普通的AbstractModule传递给Guice时,该类是未知的。

想法?溶液

编辑:问题是Widget的实现是动态编译的(如果文件发生变化,总是很新),并且必须通过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)
   }

 }

完整答案:

好吧......塔维安确实表明了一种方式。如果在配置模块中获取Injector(通过注入),它将能够注入新创建的类,如下所示:

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);

1 个答案:

答案 0 :(得分:1)

如果生成的类具有可注入的构造函数,则可以使用Injector.getInstance(Class<T>)