我在使用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类。我找不到正确的方法。我试着制作自己的制作人,但我还不太熟悉JavaSE中的Weld和CDI。
我的坏生产者(我认为这是完全糟糕的)
public class InjectionProvider {
@Produces
public Module getInsrance(Class<?> clazz) throws ReflectiveOperationException {
final Constructor<?> constructor = clazz.getDeclaredConstructor();
return (Module) constructor.newInstance();
}
}
我找不到这个问题的答案,所以如果有人能帮我,我会很高兴的。我真的需要这种创建类的方式,因为我不想每次需要更改Module类中的某些属性时都更改代码。
编辑:
我无法与制片人合作。但我找到了一个变通办法。我不确定这是否是一个好的解决方案,但目前有效。
我创建了一个带有Weld上下文的singleton类。
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();
我认为这是一个很好的解决方案。
我不知道我是否理解你的问题,特别是与类加载相关的部分与生产者中使用的代码相比。我想知道你是否希望注射对你为自己安装的对象Class.forName.作为物体的装饰通常通过框架使用修改后的类加载器并返回修改或装饰过的物体,我想你方法禁用这种修饰(依赖项注入)。你没有使用对新用户的呼叫离开instanciating到类加载器,而不是使用实例化通过反射。
请参阅编辑后的文章。如果有人有更好的解决方案,我会很高兴的。