0

我在使用 Weld 上下文通过反射创建对象时遇到问题。

我正在从外部文件加载类及其配置。

简化我的代码如下:

final Class<?> moduleClass = Class.forName(properties.getProperty("className"));

然后我正在创建这个类的实例

final Constructor<?> constructor = moduleClass.getDeclaredConstructor();
module = (Module) constructor.newInstance();

模块类:

@ModuleImpl
public class ExampleModule extends AbstractModule (implements Module interface) {

    @Inject
    private Test test;

模块创建成功,但它没有焊接上下文来注入测试类。而且我找不到正确的方法。我尝试制作自己的生产者,但我对 Java SE 中的 Weld 和 CDI 还不太熟悉。

我破碎的制片人(我认为它非常糟糕)

public class InjectionProvider {

    @Produces
    public Module getInsrance(Class<?> clazz) throws ReflectiveOperationException {
        final Constructor<?> constructor = clazz.getDeclaredConstructor();
        return (Module) constructor.newInstance();
    }
}

我找不到关于这个问题的任何东西,所以如果有人可以帮助我,我会很高兴。我真的需要这种创建类的方式,因为我不想在每次需要更改 Module 类中的某些属性时都更改我的代码。

编辑:

我无法与制片人合作。但我找到了解决方法。我不确定这是否是一个好的解决方案,但它现在有效。

我创建了一个带有 Weld 上下文的单例类。

public class TheMightyWeld {

    private static Weld weld;

    private static WeldContainer weldContainer;

    public static WeldContainer getThePowerOfCreation() {
        if (weldContainer == null) {
            weld = new Weld();
            weldContainer = weld.initialize();
        }
        return weldContainer;
    }

    public static void shutdown() {
        if (weld != null) {
            weld.shutdown();
        }
    }

}

然后我可以初始化我的应用程序

TheMightyWeld.getPowerOfCreation().instance().select(FXApplicationStarter.class).get().startApplication(primaryStage, getParameters());

稍后在代码中我可以重用它进行反射

module = (Module) TheMightyWeld.getPowerOfCreation().instance().select(moduleClass).get();

编辑2:

我找到了更好的解决方案。我可以注入焊接实例

@Inject
private Instance<Object> creator;

那么我只能这样做

creator.select(moduleClass).get();

我认为这是一个很好的解决方案。

4

2 回答 2

0

我不知道我是否理解您的问题,特别是与类加载相关的部分与生产者中使用的代码。我想知道您是否希望注入适用于您通过 Class.forName 为自己实例化的对象。由于通过框架装饰对象通常是使用修改后的类加载器并返回修改或装饰的对象,我猜你的方法禁用了这种装饰(依赖注入)。您没有使用对 new 的调用,而是将实例化留给类加载器,而是通过反射使用实例化。

于 2014-09-03T17:06:46.300 回答
0

请参阅编辑后的帖子。如果有人有更好的解决方案,我会很高兴的。

于 2014-09-03T20:02:50.860 回答