我在使用 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();
我认为这是一个很好的解决方案。