首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Weld-SE上下文的Java反射实例

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

Stack Overflow用户
提问于 2014-09-03 16:47:28
回答 2查看 777关注 0票数 0

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

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

简化我的代码如下:

代码语言:javascript
复制
final Class<?> moduleClass = Class.forName(properties.getProperty("className"));

然后我将创建这个类的实例

代码语言:javascript
复制
final Constructor<?> constructor = moduleClass.getDeclaredConstructor();
module = (Module) constructor.newInstance();

模块类:

代码语言:javascript
复制
@ModuleImpl
public class ExampleModule extends AbstractModule (implements Module interface) {

    @Inject
    private Test test;

模块是成功创建的,但是它还没有焊接上下文来注入Test类。我也找不到正确的方法。我试着做自己的制作人,但我对Java中的Weld和CDI还不太熟悉。

我的坏制片人(我认为这是完全不好的)

代码语言:javascript
复制
public class InjectionProvider {

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

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

编辑:

我不能和制片人合作。但我找到了解决办法。我不确定这是否是一个好的解决方案,但它目前是有效的。

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

代码语言:javascript
复制
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();
        }
    }

}

然后我就可以用

代码语言:javascript
复制
TheMightyWeld.getPowerOfCreation().instance().select(FXApplicationStarter.class).get().startApplication(primaryStage, getParameters());

在后面的代码中,我可以重用它来进行反射。

代码语言:javascript
复制
module = (Module) TheMightyWeld.getPowerOfCreation().instance().select(moduleClass).get();

编辑2:

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

代码语言:javascript
复制
@Inject
private Instance<Object> creator;

那我只能做这个

代码语言:javascript
复制
creator.select(moduleClass).get();

我认为这是一个很好的解决办法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-03 20:02:50

见编辑后的文章。如果有人有更好的解决方案,我会为此感到高兴的。

票数 0
EN

Stack Overflow用户

发布于 2014-09-03 17:06:46

我不知道我是否正确地理解了您的问题,特别是与类加载和生产者中使用的代码相关的部分。我想知道您是否希望inject能够为您通过Class.forName实例化的对象工作。由于通过框架对对象的修饰通常是使用修改的类加载程序完成的,并返回修改或修饰的对象,因此我猜您的方法将禁用此装饰(依赖项注入)。您没有使用对new的调用,而是通过反射使用实例化,将实例化留给类加载器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25649648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档