Вот код для печати аннотаций, так что вы можете увидеть, где в 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")