具有Weld SE上下文的Java反射实例

具有Weld SE上下文的Java反射实例,java,reflection,weld-se,Java,Reflection,Weld Se,我在使用焊接上下文通过反射创建对象时遇到问题 public class TheMightyWeld { private static Weld weld; private static WeldContainer weldContainer; public static WeldContainer getThePowerOfCreation() { if (weldContainer == null) { weld = new

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

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

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

简化我的代码如下所示:

final Class<?> moduleClass = Class.forName(properties.getProperty("className"));
模块已成功创建,但它没有注入测试类的焊接上下文。我找不到正确的方法。我试着制作自己的制作人,但我还不太熟悉JavaSE中的Weld和CDI

我的坏制作人(我认为这太糟糕了)

然后我可以用

TheMightyWeld.getPowerOfCreation().instance().select(FXApplicationStarter.class).get().startApplication(primaryStage, getParameters());
在以后的代码中,我可以重用它进行反射

module = (Module) TheMightyWeld.getPowerOfCreation().instance().select(moduleClass).get();
编辑2:

我找到了更好的解决办法。我可以举个例子

@Inject
private Instance<Object> creator;

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

我不知道我是否正确理解你的问题, 特别是与类加载相关的部分 与生产者使用的代码进行对比。 我想知道你是否希望为我工作 为自己实例化的对象 Class.forName。作为物品的装饰 通常通过框架完成 使用修改的类加载器并返回 我猜你的 该方法禁用此装饰(依赖项注入)。 您没有使用呼叫new来离开实例化 对于类加载器,您使用的是实例化
通过反思。

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

是的。这就是问题所在,我没有使用Weld类加载器。我的制作人只是一个糟糕的尝试,别看它。所以我的问题是:如何使用Weld以这种或类似的方式实例化我的对象。因为我不知道我将实例化什么类。我只知道他们将实现模块接口,将来我可以有很多对象,所以不可能以其他方式实例化它们。好吧,但这似乎是一个悖论。由于cdi是声明性的,它有点像动态类型,就像我说的,体面的注入发生在一个通过反射无法到达的点上。通过这种方式实例化的cdi提供程序不知道您的对象。也许您可以使用自己的类加载器调用cdi类加载器,但由于这是一个安全问题,我猜您的weld提供程序(容器)将不允许这样的方法,因为使用反射,这意味着代理反射对象本身,这是一件非常繁重的事情。您仍然可以使用模块化交换您正在使用的接口的实现,因为您可以切换实现它的jar文件。使用@New注释排序添加生产者方法的动态方面,但仍然需要知道要产生的类型,如果实现是自己的,则留下接口的可生产实现列表。
TheMightyWeld.getPowerOfCreation().instance().select(FXApplicationStarter.class).get().startApplication(primaryStage, getParameters());
module = (Module) TheMightyWeld.getPowerOfCreation().instance().select(moduleClass).get();
@Inject
private Instance<Object> creator;
creator.select(moduleClass).get();