constructor.getgenericparametertypes用于获取构造函数声明的泛型参数类型,返回type[]以保留泛型信息;而getparametertypes仅返回擦除后的class[],丢失泛型细节。

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











