JavaEE7CDI手动实例化

JavaEE7CDI手动实例化,java,jakarta-ee,cdi,Java,Jakarta Ee,Cdi,我有一个带有@Inject注释字段的类。我使用反射实例化该类,但我希望CDI注入实例来执行类实例字段。有办法吗 Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance(); CDI.injectAll(myInstanceWithDependecies);//This is what i want 有人知道怎么做吗?如果有一种不用反射扫描每个字段的方法,我将不胜感激 提前谢谢 此链接

我有一个带有@Inject注释字段的类。我使用反射实例化该类,但我希望CDI注入实例来执行类实例字段。有办法吗

Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance();
CDI.injectAll(myInstanceWithDependecies);//This is what i want
有人知道怎么做吗?如果有一种不用反射扫描每个字段的方法,我将不胜感激


提前谢谢

此链接介绍如何在JavaSE应用程序中使用OpenWebBeans:

如果您想将其用于单元测试,我建议您使用Arquillian:

这就完成了工作

SomeBean=CDI.current().select(SomeBean.class.get()


为了解析CDI依赖项,您的
com.package.MyClass
实例必须是一个托管bean(由容器实例化),否则无法让容器解析其依赖项

要解决您的问题,您可以在不自己创建实例的情况下执行编程查找:

CDI.current().select(Class.forName("com.package.MyClass")).get() 
//remember to check for ambiguous or unsatisfied dependency

如果您的
com.package.MyClass
不是由CDI管理的,则标准CDI不可能像其他人指出的那样注入依赖项

但是,所有基础设施都可用。DeltaSpike提供了您想要的功能。也可以在不包含DeltaSpike的情况下使用此代码片段(不依赖于其他DeltaSpike代码)

@SuppressWarnings("unchecked")
public static <T> T injectFields(T instance) {
    if (instance == null) {
        return null;
    }
    BeanManager beanManager = CDI.current().getBeanManager();
    CreationalContext<T> creationalContext = beanManager.createCreationalContext(null);
    AnnotatedType<T> annotatedType =
        beanManager.createAnnotatedType((Class<T>) instance.getClass());
    InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
    injectionTarget.inject(instance, creationalContext);
    return instance;
}
@SuppressWarnings(“未选中”)
公共静态T字段(T实例){
if(实例==null){
返回null;
}
BeanManager BeanManager=CDI.current().getBeanManager();
CreationContext CreationContext=beanManager.CreateCreationContext(null);
AnnotatedType AnnotatedType=
beanManager.createAnnotatedType((类)instance.getClass());
InjectionTarget InjectionTarget=beanManager.createInjectionTarget(annotatedType);
injectionTarget.Injection(实例,CreationContext);
返回实例;
}

CDI确实有文档,在这一点上,您可以阅读生产者方法:。您想让它编写JUnit测试还是出于其他原因?我知道它有文档,我去过那里,也读过它。问题是你没有理解我的问题。我知道生产者的方法和领域。他们帮不了我解决问题。我正在自己实例化这个类。你看不到我正在实例化的类是动态的吗?我需要一种调用CDI并告诉它在我的对象实例上进行注入的方法。我想这就是您要寻找的。