使用Weld-SE上下文的Java反射实例

时间:2014-09-03 16:47:28

标签: java reflection weld-se

我在使用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;

模块已成功创建,但它没有焊接上下文来注入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();

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

2 个答案:

答案 0 :(得分:0)

我不知道我是否理解你的问题, 特别是与类加载相关的部分 与生产者使用的代码相比。 我想知道你是否希望注入工作 一个你通过自己实现的对象 的Class.forName。作为物体的装饰 通过框架通常是完成的 使用修改过的类加载器并返回 修改或装饰的对象,我想你的 方法禁用此装饰(依赖注入)。 你没有使用新的电话离开实例 到类加载器而不是你正在使用实例化 通过反思。

答案 1 :(得分:0)

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