2016-04-07 15 views
3

私は@Injectで注釈が付けられたフィールドを持つクラスを持っています。リフレクションを使用してクラスをインスタンス化しますが、CDIにインスタンスを挿入してクラスインスタンスフィールドを実行させます。それを行う方法はありますか?Java EE 7 CDIマニュアルインスタンシエーション

Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance(); 
CDI.injectAll(myInstanceWithDependecies);//This is what i want 

誰かがこれを行う方法を知っていますか?反射を使って各フィールドをスキャンすることなくそれを行う方法があれば、私は感謝します。

ありがとうございます。

+0

CDIは本当にあなたがプロデューサメソッドについて読んでいました、その時点でのドキュメントを、持っていません。 – Gimby

+0

これでJUnitテストを記述したいのですか? – tak3shi

+1

私はドキュメントがあることを知っています、私はそこにいて、私はそれを読んでいます。問題はあなたが私の問題を理解していないということです。私は生産者の方法や分野について知っています。彼らは私の問題を解決する助けにはなりません。私は自分でクラスをインスタンス化しています。インスタンス化しているクラスが動的であることがわかりますか?私はCDIを呼び出す方法が必要で、私のオブジェクトインスタンスでインジェクションを行うよう指示します。 –

答えて

3

これでジョブが完了します

SomeBean bean = CDI.current()。select(SomeBean.class).get(); CDIの依存関係が解決させるためには

0

コンテナがその依存関係を解決できるようにすることはできませんされていない場合、com.package.MyClassのインスタンスは、(コンテナによってインスタンス化)管理対象Beanである必要があります。

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

あなたcom.package.MyClassはCDIによって管理されていない場合、それは指摘したように、依存関係を注入するための標準的なCDIによって可能ではありません:あなたは、インスタンスを自分で作成することなく、プログラムの検索を行うことができますあなたの問題を解決するために

他人によって。

ただし、すべてのインフラストラクチャが利用可能です。 DeltaSpikeは、探している機能を提供します。 DeltaSpikeを含めることなくこのコードフラグメント(他のDeltaSpikeコードに依存しない)を使用することもできます。 https://docs.oracle.com/javaee/6/tutorial/doc/gjdid.html:

@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; 
}