ネストされたパラメータのパラメータに注釈を取得する方法?

ゆう牙:

私はこのような機能を持っている場合は、

public void park( List< @myNote("list") List< @myNote("integer") Integer>> l){ System.out.println("park"); }

私はParameter.getAnnotations()とParamter.getDeclaredAnnotationを使用している場合は、私だけ@myNote(「リスト」)を取得することができます。注釈@myNote(「整数」)を取得するための任意の方法はありますか?

これはに関連している可能性があり、ネストされたタイプの内部構造のすべてのタイプを取得するにはどのように?

アンドレアス:

リフレクションAPIで、彼らが見つけることができる場所を見ることができるようにここでは、注釈を印刷するためのコードです。

基本的に、あなたが呼び出すparam.getAnnotatedType()場合は、チェックAnnotatedTypeされAnnotatedParameterizedType、そしてコールgetAnnotatedActualTypeArguments()ジェネリック型引数を取得し、再帰的にそれを行います。

それぞれについてAnnotatedType、トップレベルまたはネストされた、あなたは呼び出すgetDeclaredAnnotations()か、getAnnotations()その型に注釈を取得します。

あなたはそれがどのように動作するかを見ることができるだけので、私は、余分なものを追加しました。

public class Test {
    public static void main(String[] args) {
        Method method = Test.class.getDeclaredMethod("park", List.class, Map.class);
        for (Parameter param : method.getParameters()) {
            System.out.println("Parameter: " + param);
            printAnnotatedType(1, param.getAnnotatedType());
        }
    }
    static void printAnnotatedType(int indent, AnnotatedType type) {
        System.out.println("  ".repeat(indent) + "AnnotatedType: " + type);
        System.out.println("  ".repeat(indent + 2) + "Type: " + type.getType());
        for (Annotation annotation : type.getDeclaredAnnotations()) {
            System.out.println("  ".repeat(indent + 2) + "Annotation: " + annotation);
        }
        if (type instanceof AnnotatedParameterizedType) {
            AnnotatedParameterizedType pt = (AnnotatedParameterizedType) type;
            for (AnnotatedType typeArg : pt.getAnnotatedActualTypeArguments()) {
                printAnnotatedType(indent + 1, typeArg);
            }
        }
    }
    public void park(@myNote("p0") List< @myNote("list") List< @myNote("integer") @myOther Integer>> l,
                     @myNote("p1") Map< @myNote("key") Long, @myNote("value") String> m) {
        System.out.println("park");
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface myNote {
    String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface myOther {
}

出力

Parameter: java.util.List<java.util.List<java.lang.Integer>> arg0
  AnnotatedType: @myNote(value="p0") java.util.List<@myNote(value="list") java.util.List<@myNote(value="integer") @myOther() java.lang.Integer>>
      Type: java.util.List<java.util.List<java.lang.Integer>>
      Annotation: @myNote(value="p0")
    AnnotatedType: @myNote(value="list") java.util.List<@myNote(value="integer") @myOther() java.lang.Integer>
        Type: java.util.List<java.lang.Integer>
        Annotation: @myNote(value="list")
      AnnotatedType: @myNote(value="integer") @myOther() java.lang.Integer
          Type: class java.lang.Integer
          Annotation: @myNote(value="integer")
          Annotation: @myOther()
Parameter: java.util.Map<java.lang.Long, java.lang.String> arg1
  AnnotatedType: @myNote(value="p1") java.util.Map<@myNote(value="key") java.lang.Long, @myNote(value="value") java.lang.String>
      Type: java.util.Map<java.lang.Long, java.lang.String>
      Annotation: @myNote(value="p1")
    AnnotatedType: @myNote(value="key") java.lang.Long
        Type: class java.lang.Long
        Annotation: @myNote(value="key")
    AnnotatedType: @myNote(value="value") java.lang.String
        Type: class java.lang.String
        Annotation: @myNote(value="value")

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21081&siteId=1