私は少し遅くなるかもしれないので、私はそれが簡単な質問だったと思ったものを解決するために把握することはできません。Javaジェネリックとリフレクション|どのようにジェネリッククラスをインスタンス化する
私は基本的にこのような状況があります。
1)基底クラスMyDAO
public abstract class MyDAO<K, E> implements DAO<K, E>
{
....
}
2)指定されたパッケージにMyDAO具象クラスの実装の束は、言う:
public class TaxonomyDAO extends MyDAO<Integer,Taxonomy>{
....
}
すべてのクラスrelevantoを特徴MyDAOは、基本的に特定のDAOを追加延びます彼らのE要素に。私は、このクラスが存在する場合、WhateverClassDAOのインスタンスを提供するためにリフレクションを使用し、そうでない場合はベースMyDAOを返すことを目標とする汎用ファクトリを作成しています。 Kが常に整数であるとしましょう。
私はこのような何か書いている:
public Object getDAOForEntity(Class c)
{
createEmfa();
try {
Class eDao = Class.forName(getClass().getPackage().getName()+c.getSimpleName()+"DAO");
Constructor<?> cons = eDao.getConstructor(EntityManagerFactory.class);
return cons.newInstance(emfa);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
return new MyDAO<Integer,?????>(emfa) {};
}
}
このクラス、Class c
(たとえばWhateverClass
)指定されたパラメータ化コンストラクタを使用してWhateverClassDAO
のインスタンスを作成するために反射を使用しようとします。 ***DAO
クラスは工場の同じパッケージにあると見なされます(私はここで投稿するのに十分シンプルです)。
反射で失敗したのでWhateverClassDAOがないと仮定してMyDAO<Integer,WhateverClass>
を返したいと思いますが、そこには正しいE
引数を渡すことができません。私は運のない引数としてClass<E>
を渡そうとしました。私は基本的に何に代わるべきか疑問に思っています。
これは範囲外ですが、このコードはすべてシングルトンEJBの内部にあります。
適切なドキュメントへのリンクの形であっても、どんな助けも大歓迎です。
Chuck Norrisだけがjavaで抽象クラスをインスタンス化できます。 – aviad
良い、私はそれに値する – elbuild
私は怒っていないことを願っています。ちょうど冗談;)そのようなDAOが存在しない場合、私はちょうどオプションの不在を返したでしょう。 – aviad