Constructor.getGenericParameterTypes用于获取构造函数声明的泛型参数类型,返回Type[]以保留泛型信息;而getParameterTypes仅返回擦除后的Class[],丢失泛型细节。

Constructor.getGenericParameterTypes 是 Java 反射中用于获取构造函数**声明的泛型参数类型**(即带泛型信息的类型,如 List<String>、T、Map<K, V>)的方法。它返回的是 Type[],而非简单的 Class[],因此能保留泛型擦除前的原始类型信息。
为什么不能只用 getParameterTypes?
Constructor.getParameterTypes() 返回的是擦除后的 Class[],比如 List<String> 会变成 List.class,丢失 String;而 getGenericParameterTypes() 能返回代表 List<String> 的 ParameterizedType 实例,从而还原完整泛型结构。
如何正确解析返回的 Type 数组?
返回的每个 Type 可能是以下几种类型之一,需按实际类型做判断和转换:
-
Class:非泛型类型(如String、int),直接强转即可 -
ParameterizedType:参数化类型(如List<Integer>、Map<String, ? extends Number>),可调用getRawType()和getActualTypeArguments() -
TypeVariable:类型变量(如构造器定义为<T> Foo(T t)中的T),可通过getName()和getBounds()获取约束 -
WildcardType:通配符类型(如? super Exception),需用getUpperBounds()/getLowerBounds()
典型使用示例
假设有如下类:
立即学习“Java免费学习笔记(深入)”;
class Box<T> {public <U extends Comparable<U>> Box(List<T> items, U flag) {}
}
获取其构造器并解析泛型参数:
- 调用
Box.class.getConstructors()[0].getGenericParameterTypes() - 得到长度为 2 的
Type[]:- 第 0 个是
ParameterizedType→ 表示List<T>,其中getRawType() == List.class,getActualTypeArguments()[0]是TypeVariable(即T) - 第 1 个是
TypeVariable→ 表示U,getBounds()[0]是Comparable<U>对应的ParameterizedType
- 第 0 个是
注意事项
该方法仅反映源码中**构造器声明时写的泛型类型**,不涉及运行时传入的实际类型(Java 泛型无运行时类型)。若构造器未使用泛型(如 public Foo(String s)),则返回的仍是 Class 类型数组,与 getParameterTypes() 内容一致,只是类型为 Type。


















