java - 注入(inject)一个用 Guice 即时编译的类

标签 java class dynamic dependency-injection guice

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

如何将新生成的类传递给 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)
   }

 }

完整答案:

好吧……Tavian 确实展示了一种方法。如果在配置模块中获得(通过注入(inject))注入(inject)器,这将起作用,它将能够像这样注入(inject)新创建的类:

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

最佳答案

您可以使用 Injector.getInstance(Class<T>) ,前提是生成的类具有可注入(inject)的构造函数。

关于java - 注入(inject)一个用 Guice 即时编译的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17754023/

相关文章:

javascript - 单击时交换 <li> 的类

C# 类数组

java - 如何在 Vaadin 8 中绑定(bind)外键

java - 如何将 Bouncy CaSTLe 轻量级 API 与 AES 和 PBE 结合使用

javascript - 类语法 : React Component Fires the OnChange within Closure

c# - 具有多个/未知条件的动态 linq 查询

linq - 为 Any() 方法动态构建 LINQ 过滤器?

magento - 在 magento 中将动态价格从详细页面传递到购物车

java - Spring MVC 如何将表单值转换为对象?

java - 如何使用Java获取XML文件中的节点名称?