2

私は注釈付きのクラスを持っています:

public class CacheMessageHolder<TestMessage> implements MessageHolder<TestMessage> {
    protected @MessageHolderType TestMessage message;
    @Override
    @SendProtoAll (proto ="protoMessageClass", matchType=MatchType.PARTIAL)
    public void setMessage( TestMessage msg) {
        this.message = msg;     
    }
}

アノテーション プロセッサで、setMessage メソッドに渡されたオブジェクトの getter メソッドのリストを取得したいと考えています。この情報はコード生成に使用されます。

私は ElementScanner6 を拡張し、パラメーターを保持しているように見える VariableElement を取得することができましたが、ここからどこへ行くべきかわかりません。

したがって、この例では、コンパイル時に TestMessage クラスのすべてのメソッドを取得したいと考えています。

何か案は

4

1 に答える 1

11

注釈処理は非常に面倒で、すぐに迷子になる可能性があります。このパラメーター要素に対応する型を取得し、次にこの型に対応する要素を取得し、そのメンバーを取得してフィルター処理する必要があると思います。次のコードを試してみて、うまくいくかどうか教えてください:

VariableElement parameterElement;
ProcessingEnvironment processingEnv;

TypeMirror parameterType = parameterElement.asType();
Types typeUtils = processingEnv.getTypeUtils();
TypeElement typeElement = (TypeElement) typeUtils.asElement(parameterType);
Elements elementUtils = processingEnv.getElementUtils()
List<? extends Element> elementMembers = elementUtils.getAllMembers(typeElement);
List<ExecutableElement> elementMethods = ElementFilter.methodsIn(elementMembers);
for(ExecutableElement methodElement : elementMethods) {
    if (methodElement.getParameters().size()==0 && methodElement.getSimpleName().toString().startsWith("get")) {
      // do something
    }
}

うまくいくはずだと思いますが、メソッド本体内で何が行われたかを確認できないため、それがゲッターであることを100%確信することはできません。「getter」とは、「get」で始まり、パラメーターのないメソッドを意味すると想定しました。

それはあなたの質問に答えていますか?

于 2011-08-04T10:48:44.340 に答える