Как получить аннотации во вложенном параметре? - PullRequest
0 голосов
/ 03 марта 2020

Если у меня есть такая функция,

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

Если я использую Parameter.getAnnotations () и Paramter.getDeclaredAnnotation, я могу получить только @myNote ("список"). Есть ли способы получить аннотацию @myNote ("целое число")?

Это может быть связано с Как получить все типы внутренних структур вложенного типа?

1 Ответ

2 голосов
/ 03 марта 2020

Вот код для печати аннотаций, так что вы можете увидеть, где в API отражения они могут быть найдены.

В основном, вы вызываете param.getAnnotatedType(), проверьте, если AnnotatedType - это AnnotatedParameterizedType и вызовите getAnnotatedActualTypeArguments(), чтобы получить аргументы типа generic c и сделать это рекурсивно.

Для каждого 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...