Ok。ここに私の解決策があります。javaassist を使用して、実行時にクラスとそれに応じた Class オブジェクトを生成します。最終結果は
@OneToMany(targetEntity = com.foo.Bar.class)
Java ソース コード ファイル内の通常のテキストとして、この生成された「ダミー クラス」が参照された実際の実際のクラスと実際には同等でなくてもかまいません。
そこで、ギヨームが示したように注釈の作成を調整し、ClassNotfoundExeption
. 例外ハンドラーでは、generateDummyClass
javaassist を使用して Class オブジェクトを作成するメソッドを呼び出します。
JAnnotationUse oneToMany = field.annotate(OneToMany.class);
//...snipped...
try {
oneToMany.param("targetEntity", Class.forName(jpaProperty.getTargetEntity()));
} catch (ClassNotFoundException ex) {
try {
Class targetEntityClass = generateDummyClass(jpaProperty.getTargetEntity());
oneToMany.param("targetEntity", targetEntityClass);
} catch (CannotCompileException compileEx) {
throw ex;
}
}
}
generateDummyClass
javaassist を使用して実行時にクラス オブジェクトを作成するメソッド:
private Class<?> generateDummyClass(String fullQualifedClassName)
throws IOException, CannotCompileException {
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(new ClassClassPath(this.getClass()));
CtClass ctClass = pool.makeClass(fullQualifedClassName);
Class<?> clazz = ctClass.toClass();
return clazz;
}
そして、次の Java ソース コード ファイルを取得します。
@OneToMany(targetEntity = org.foo.Bar.class)
private Set<Bar> bars = new HashSet<Bar>();