2011-10-18 15 views
9

プラグイン可能注釈処理APIを使用してJava注釈を処理しています。使用したアノテーションを処理することも可能ですかメソッド本体?メソッド本体内の注釈の処理

ありがとうございました。ピーター

答えて

4

私が思うには、私は解決策を見つけました。私が思ったように、現在のjavacでは不可能です。ローカルアノテーションは単なるコメントであり、プラグイン可能なアノテーション処理APIによって処理されることはありません。しかし、JSR308には、タイプ変数、ローカル変数、注釈型チェック、キャスティングのパラメータとして素晴らしいものをサポートする型の注釈を扱う興味深い作業があります。見た目はopenJDK 8に組み込まれます。nice

その答えに感謝します。
+0

JSR 308は、アノテーション処理を直接サポートしていません(ただし、ローカル変数注釈がクラスファイルに格納されていない長年のバグは修正されます)。 [Checker Framework](http://checkerframework.org)はJSR 308上に構築され、メソッド本体内の注釈を処理する便利な訪問者を提供します。 – mernst

1

JSR269では、関連するインタフェースは、このような注釈にアクセスするためのgetAnnotation(Class<A> annotationType)を継承javax.lang.model.element.VariableElement、次のようになります。

for (VariableElement variable : ElementFilter.fieldsIn(methods)) { 
    final AnnotationType annotation = variable.getAnnotation(AnnotationType.class); 
    if (annotation != null) { 
     // ... 
    } 
} 
+2

しかし、 'methods'は要素の集合であり、既に注釈付きフィールドが含まれているはずです(メソッドがそのセットに対して悪い名前になる)。だから 'fieldsIn'は"メソッド内のフィールド(=ローカル変数) "を返しませんが、与えられた要素のセットだけをフィルタリングします。その問題は、APIが(プロセスメソッドのパラメータとして)注釈付きのローカル変数を与えないことです。今のところ、私はすべての(注釈付きのクラスではない)クラスを処理し、ローカル変数の注釈を手動で検索する必要があるように見えます。あなたの例を使用する方法がありますか? – wrm