13

Asmを使用すると、単純なゲッターとセッターを簡単に定義できます(幸い、FAQでも説明されています)。しかし、言及されておらず、ドキュメントを見つけることができなかった1つのことは、ジェネリック型情報を使用してこれらを実装する方法です。

私は実際にジェネリック型情報自体を非常に簡単に判別できます(コードは既存のフィールドやメソッドを取り、完全なジェネリック型の処理と解決が存在するため)。ジェネリック型が含まれている型のジェネリックバージョンを生成する必要があります。

これが署名AsmClassWriter/ MethodVisitor呼び出しの変更と同じくらい簡単であることを願っていますが、ドキュメントの一部のコメントは、それほど簡単ではない可能性があることを示しています(ジェネリック情報は通常の情報とは少し異なる場所に格納されるため)。

編集:エントリポイントは「ClassWriter.visitField / Method(....、文字列署名)」のように見えます-通常の非ジェネリッククラス情報を含む「説明」ですが、「署名」(JLS)という用語は具体的にはジェネリックスへ-タイプ情報を含みます。

4

2 に答える 2

9

SignatureWriterASMのクラスを使用して署名を作成できます。

たとえば、このメソッドの署名を記述したいとします。

public <K> void doSomething(K thing)

次のコードを使用できます。

SignatureWriter signature = new SignatureWriter();
signature.visitFormalTypeParameter("K");

// Ensure that <K> extends java.lang.Object
{
    SignatureVisitor classBound = signature.visitClassBound();
    classBound.visitClassType(Type.getInternalName(Object.class));
    classBound.visitEnd();
}

// The parameter uses the <K> type variable
signature.visitParameterType().visitTypeVariable("K");

// The return type uses the void primitive ('V')
signature.visitReturnType().visitBaseType('V');

signature.visitEnd();

String signatureString = signature.toString();

これは次と同等です:

String signatureString = "<K:Ljava/lang/Object;>(TK;)V;"
于 2010-07-29T17:24:21.403 に答える
-2

私の経験では、ほとんどのオンザフライバイトコード生成ライブラリはジェネリック型を適切にサポートしていません。ただし、消去されたクラスは問題なく機能します(もちろん、後でそれらのクラスをイントロスペクトしたい場合を除きます)。

于 2010-07-26T08:43:12.693 に答える