Java 使用Guice注入动态编译的类

Java 使用Guice注入动态编译的类,java,class,dynamic,dependency-injection,guice,Java,Class,Dynamic,Dependency Injection,Guice,我有一个工厂,它读取一个配置文件,并在程序运行时从源代码生成一个类 如何将新生成的类传递给Guice并让它从中创建实例。在将普通抽象模块传递给Guice时,该类是未知的 想法?解决方案 编辑:问题是小部件的实现是动态编译的(如果文件发生更改,则始终是新的),并且必须通过Guice自动提供。示例AbstractModule如下所示: public class MyModule extends AbstractModule { protected void configure() {

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

如何将新生成的类传递给Guice并让它从中创建实例。在将普通抽象模块传递给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);
公共类MyModule扩展了AbstractModule{
受保护的void configure(){
绑定(Service.class).to(ServiceImpl.class).in(Singleton.class);
…更多绑定
}
@提供者
公共小部件provideWidget(){
类clazz=ModuleCompiler.compile(“src/widgetempl.java”);
//Clazz是一个小部件。但我们不知道确切的构造函数
//我们现在需要生成一个完全注入的实例,就像它被绑定一样
//就像在“bind(Widget.class).to(clazz)”语句中一样
//在configure()方法中
返回(完全创建的注入类)
}
}
完整答案:

好的。。。塔维安确实指明了方向。如果在配置模块中(通过注入)获得了注入器,则可以这样注入新创建的类:

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);
MyModule类扩展了AbstractModule{ @凌驾 受保护的void configure(){ 绑定(Config.class).toInstance(Config.getInstance()); } @提供 公共小部件provideWidget(注入器注入器)引发异常{ 类c=ModuleCompiler.compile(“src/widgetempl.java”); 返回injector.getInstance(c); } } MyModule=新的MyModule(); 喷油器喷油器=Guice.createInjector(模块); Widget w=injector.getInstance(Widget.class);
只要生成的类具有可注入构造函数,就可以使用。

LOL.Ooops。我无意中否决了这个。但是它确实有效。注入器可以注入AbstractModule中的提供者,然后用于实例化新的类对象。