AnnotatedType是Java反射中获取类型注解的关键接口,用于提取泛型、数组等类型位置上的注解,如@Email String或List;通过Field、Parameter等反射对象的getAnnotatedType()获取,再调用其getAnnotations()和getType()分别读取注解与底层类型。

AnnotatedType 是 Java 反射体系中用于获取“带注解的类型”信息的关键接口,它解决的是一个核心痛点:当类型本身(比如泛型、数组、参数化类型)被注解修饰时,仅靠 Class 或 Type 无法拿到那些附着在类型位置上的注解——例如 @NonNull String、List、Map 这类写法中的 @Email 或 @Valid。
什么时候会用到 AnnotatedType
它主要出现在以下几种场景中:
- 变量声明带类型注解,比如
private @NotBlank String name; - 方法参数或返回值类型含注解,如
public void setAge(@Positive int age) - 泛型实际类型参数被注解,如字段
private List tags; - 数组元素类型被注解,如
private @NotNull String[] roles;(此时注解在数组“元素类型”上,不是数组本身)
如何从不同位置获取 AnnotatedType
不能直接 new,必须通过反射 API 在具体上下文中提取:
-
字段(Field):调用
field.getAnnotatedType() -
方法参数(Parameter):先获取
Method.getParameters(),再对每个Parameter调用param.getAnnotatedType() -
方法返回值:调用
method.getAnnotatedReturnType() -
构造函数参数:类似方法参数,用
Constructor.getParameters()后取getAnnotatedType()
注意:getAnnotatedType() 返回的是该位置“整个类型表达式”所带的注解,不是字段/方法本身的注解(那是 getAnnotations() 干的事)。
读取 AnnotatedType 上的注解和类型信息
AnnotatedType 提供两组关键能力:
-
获取注解:
getAnnotations()(所有直接注解)、getDeclaredAnnotations()(仅显式声明的,不继承) -
获取底层类型:
getType()返回标准Type对象(如ParameterizedType、Class、WildcardType等),可用于进一步解析泛型结构
例如,对 private Map data; 的字段调用 getAnnotatedType().getType() 会返回一个 ParameterizedType,再调用其 getActualTypeArguments() 得到两个 Type,分别对应键和值的类型;而 getAnnotatedType() 本身不存这些注解——真正的注解是挂在每个 Type 对应的 AnnotatedType 上的(需递归获取)。
常见误区提醒
容易混淆的几个点:
-
AnnotatedType≠Annotation:前者是“被注解的类型”,后者是具体的注解实例 - 字段上的
@NotNull如果写在String前(private @NotNull String name;),它属于field.getAnnotatedType();如果写在字段名前(@NotNull private String name;),它属于field.getAnnotations() -
getAnnotatedType().getType()拿不到注解,只拿原始类型结构;注解必须通过AnnotatedType自身的方法获取 - JDK 8+ 才支持 TYPE_USE 和 TYPE_PARAMETER,旧版本反射无法识别类型位置的注解










