2011-09-11 5 views
2

注釈プロセッサは、2つのTypeElementを提供します.1つは注釈付きオブジェクト用で、もう1つは注釈自体です。コード生成のアノテーション処理中にアノテートされたクラスの型を取り出す方法は?

コードを生成するアノテーション処理中に、注釈付きオブジェクトのタイプを知る必要があるとします。修飾された名前はTypeElement.getQualifiedName()で抽出できます。しかし、Class.forName(fullyQualifiedName)を使用しようとすると、ClassNotFoundExceptionがスローされます。

おそらく、クラスが注釈処理コードのパスにないことを意味します。すべての注釈付きコードを処理ライブラリのクラスパスに入れなくても、注釈処理中にそのようなクラスを取り出すことは今まで可能ですか?

この問題を回避するには、のようなものを生成することです:

Class c = Class.forName("thefullyqualifiedname"); 

を、代わりに生成されたコードではCを使用しますが、それはきれいではありません。私が思い付くことができ

答えて

0

最適な回避策は以下の通りです:生成

JClass annotatedType = jcmSource.ref(Class.class); 

    JInvocation m = annotatedType.staticInvoke("forName"); 
    m.arg(fa.getAnnotated().toString()); 

    JFieldVar field = sourceClass.field(
      JMod.PRIVATE | JMod.STATIC, annotatedType, "c"); 

    JBlock staticInit = sourceClass.init(); 

    JTryBlock tb = staticInit._try(); 
    JBlock jbtb = tb.body(); 
     jbtb.assign(field, m); 
    tb._catch(jcmSource.ref(ClassNotFoundException.class)); 

:それは注釈付きクラスのクラス型への明示的なアクセスを与えるものではありません

private static Class c; 

static { 
    try { 
     c = Class.forName("net.codegentest.CodeGenTest"); 
    } catch (ClassNotFoundException _x) { 
    } 
} 

、しかしで少なくとも、コード内で生成することができます。

4

注釈処理が発生すると、注釈付きクラスの「クラス」オブジェクトは使用できません。これは、コンパイル時に発生するためです。そのため、TypeElementsとTypeMirrorsがあり、Classオブジェクトと完全に同等です。

あなたが指摘したように、アノテーションはそのクラスパス上にあるクラスオブジェクトにのみアクセスできます。それはコンパイルされているので、注釈付きクラスの場合ではありません。

クラスの代わりに文字列修飾名を使用するときれいではなく、あなたが正しいと思います。実際にはTypeElement & TypeMirror ;-)を使用する必要があります。

どのような理由でClassオブジェクトが必要ですか? TypeElement & TypeMirrorで何かできることは間違いありません。

+0

生成されたコードを介して構造体(つまり、セット)に注釈付きクラス型を登録する必要があります。自動化されていなければなりません。したがって、私は注釈の処理中に何らかの形でそれを取得/アクセスする必要があります。 – JVerstry

+0

私は注釈付きインターフェイスを実装するクラスを取得しようとしています。この目的のためにReflectionsが必要ですが、それにはClassオブジェクトが必要です: 'getSubTypesOf()'。私は、サブタイプを見つける別の方法を見つけたり、実装されたインターフェースで注釈を見つけることはできませんでした。 –

関連する問題