Java反射获取泛型边界需用getGenericSuperclass()或getGenericInterfaces(),而非getSuperclass();WildcardType对应使用处通配符(如? super Integer),TypeVariable对应声明处类型参数(如<T extends X>),二者须用instanceof区分。

Java 中通过反射获取类定义上的泛型边界(如 WildcardType 和 TypeVariable),关键在于使用 getGenericSuperclass() 或 getGenericInterfaces() 获取带泛型信息的类型,再逐层解析其类型参数。直接调用 getClass().getSuperclass() 会丢失泛型信息,必须用“generic”版本方法。
获取父类泛型实参中的 WildcardType 和 TypeVariable
假设有一个类继承自带泛型的父类,例如:
class Parent<T extends Number> { }
class Child extends Parent<? super Integer> { }
要提取 ? super Integer 这种通配符边界,需这样做:
- 调用
Child.class.getGenericSuperclass(),返回ParameterizedType - 调用其
getActualTypeArguments(),得到长度为 1 的数组,元素是WildcardType - 对
WildcardType调用getUpperBounds()和getLowerBounds():-
getUpperBounds()返回{Object.class}(因为未写上界,默认Object) -
getLowerBounds()返回{Integer.class}(对应? super Integer)
-
提取接口或父类声明中的 TypeVariable 及其边界
若父类或接口本身声明了类型变量(如 class Box<T extends Comparable<T>& Cloneable>),可通过 TypeVariable 获取其名字和约束:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 从
Box.class.getTypeParameters()获取TypeVariable<?>[] - 每个
TypeVariable可调用:-
getName()→ 返回"T" -
getBounds()→ 返回类型数组,含Comparable<T>(ParameterizedType)和Cloneable(Class) - 注意:bounds 中的
Comparable<T>本身仍含未解析的TypeVariable,需递归处理
-
区分 WildcardType 与 TypeVariable 的典型场景
二者虽都属于 Type 子接口,但语义不同,反射中需明确识别:
-
TypeVariable出现在**声明处**(类/方法定义的类型参数),如<T extends X>中的T -
WildcardType出现在**使用处**(实际传入的泛型实参),如List<? extends String>中的? extends String - 判断方式:用
instanceof检查类型,不可用getClass().getName()硬比字符串
实际解析时的常见陷阱
泛型擦除后信息不全,反射只能拿到编译期保留的结构,要注意:
- 运行时无法获取泛型实参的具体类型(如
new ArrayList<String>()中的String不会出现在实例的反射结果中) - 只有在类、接口、方法、字段等**声明层级**的泛型才能被反射读取;对象实例本身不携带泛型类型信息
-
getActualTypeArguments()返回的可能是TypeVariable、WildcardType、ParameterizedType或Class,需统一 instanceof 分支处理

















