如果我有这样的方法:
testLink(@LinkLength(min=0, max=5) List<@LinkRange(min=5, max=9) Integer> link) { ... }
如何同时获取@LinkLength和@LinkRange批注?
我假设您想反射地访问这些注释。这是一个例子:
package com.example; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.AnnotatedParameterizedType; import java.lang.reflect.AnnotatedType; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.List; public class Main { @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.TYPE_USE}) public @interface Foo { String value(); } public static void bar(@Foo("parameter") List<@Foo("type_use") Integer> list) {} public static void main(String[] args) throws NoSuchMethodException { Method method = Main.class.getMethod("bar", List.class); // get annotation from parameter Parameter parameter = method.getParameters()[0]; System.out.println("PARAMETER ANNOTATION = " + parameter.getAnnotation(Foo.class)); // get annotation from type argument used in parameter AnnotatedParameterizedType annotatedType = (AnnotatedParameterizedType) parameter.getAnnotatedType(); AnnotatedType typeArgument = annotatedType.getAnnotatedActualTypeArguments()[0]; System.out.println("TYPE_USE ANNOTATION = " + typeArgument.getAnnotation(Foo.class)); } }
输出以下内容:
PARAMETER ANNOTATION = @com.example.Main$Foo(value="parameter") TYPE_USE ANNOTATION = @com.example.Main$Foo(value="type_use")
以下是使用的方法:
Class#getMethod(String,Class...)
Class#getDeclaredMethod(String,Class...)
Executable#getParamaeters()
Method从延伸Executable。
Method
Executable
Parameter#getAnnotatedType()
AnnotatedParameterizedType#getAnnotatedActualTypeArguments()
AnnotatedElement#getAnnotation(Class)
Parameter
AnnotatedType
AnnotatedElement
上面的示例充分利用了有关该bar方法的知识。换句话说,我知道有一个参数,知道Parameter#getAnnotatedType()会返回AnnotatedParameterizedType,而且我知道参数化类型有一个类型实参。反省地扫描任意类时,不会提前知道此信息,这意味着您将必须添加适当的检查并仅在适当的时候执行某些操作。例如:
bar
AnnotatedParameterizedType
AnnotatedType type = parameter.getAnnotatedType(); if (type instanceof AnnotatedParameterizedType) { // do something... }