2

注釈プロセッサは、注釈付きオブジェクト用と注釈自体用の2 つのTypeElementを提供します。

Classコードを生成するために、注釈処理中に注釈付きオブジェクトの型を知る必要があると仮定しましょう。TypeElement.getQualifiedName()で修飾名を抽出できます。ただし、使用しようとするとClass.forName(fullyQualifiedName)ClassNotFoundException.

クラスがアノテーション処理コードのパス上にないことを意味している可能性があります。処理ライブラリのクラスパスにすべての注釈付きコードを配置することなく、注釈処理中にそのようなクラスを取得することは可能ですか?

回避策は、次のようなものを生成することです。

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

代わりに生成されたコードで c を使用しますが、クリーンではありません。

4

2 に答える 2

4

注釈処理が発生すると、コンパイル時に発生するため、注釈付きクラスの「クラス」オブジェクトが使用できないのはごく普通のことのようです。TypeElementsとTypeMirrorsが存在するのはそのためです。これらは、Classオブジェクトと厳密に同等です。

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

Classの代わりに文字列で修飾された名前を使用するのはクリーンではないとあなたが思っていることを理解しています。あなたは正しいです。実際、TypeElement&TypeMirrorを使用する必要があります;-)。

どのような理由でClassオブジェクトが必要ですか?TypeElementとTypeMirrorで何でもできると確信しています。

于 2011-09-12T07:35:10.907 に答える
1

私が思いつく最善の回避策は次のとおりです。

    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) {
    }
}

注釈付きクラスのクラス型に明示的にアクセスすることはできませんが、少なくともコード内で生成できます。

于 2011-09-11T16:29:56.983 に答える