0

コードを生成する必要があります。この場合は、suns CodeModel ライブラリを使用して注釈を生成します。注釈値は Class オブジェクトです。ただし、そのクラスはコンパイル時にはわかりません。私が今持っている解決策は次のとおりです。

JAnnotationUse oneToMany = field.annotate(OneToMany.class)
    .param("targetEntity", Class.forName(className);

ただし、これには明らかに、対応するクラスがクラスパス上にあることが必要です。ユーザーがそのような問題に対処しなければならないようにしたい。

もちろん、他のオプションは、Java ソース コード ファイルを生成し、後で (純粋な文字列として) 操作することですが、これは非常に面倒です。

CodeModel でプレーンな文字列 className + ".class" を代わりに使用する方法はありますか?

4

2 に答える 2

0

ClassNotFoundExceptionをキャッチすることで、クラスがクラスパスにない場合を処理できます。

try {
 JAnnotationUse oneToMany = field.annotate(OneToMany.class)
    .param("targetEntity", Class.forName(className);
} catch (ClassNotFoundException e) {
 // handle the exception
}

例外を処理する部分は、エラーをログに記録したり、別の注釈を追加したり、例外をスローしたりしたい状況に応じて、達成しようとしているものによって異なります...

于 2013-06-27T09:07:51.900 に答える
0

Ok。ここに私の解決策があります。javaassist を使用して、実行時にクラスとそれに応じた Class オブジェクトを生成します。最終結果は

 @OneToMany(targetEntity = com.foo.Bar.class)

Java ソース コード ファイル内の通常のテキストとして、この生成された「ダミー クラス」が参照された実際の実際のクラスと実際には同等でなくてもかまいません。

そこで、ギヨームが示したように注釈の作成を調整し、ClassNotfoundExeption. 例外ハンドラーでは、generateDummyClassjavaassist を使用して 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;
        }
    }
}

generateDummyClassjavaassist を使用して実行時にクラス オブジェクトを作成するメソッド:

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>();
于 2013-06-27T11:13:36.683 に答える