484. Java 反射 - 获取构造器的参数
和方法类似,构造器也有参数。通过反射我们可以读取这些参数的:
-
原始类型:通过
getParameterTypes()返回Class<?>[] -
泛型类型:通过
getGenericParameterTypes()返回Type[],保留了泛型信息
1. 获取原始参数类型
下面的示例查询 ArrayList 的所有构造器,并打印它们的参数类型:
import java.lang.reflect.*;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
Class<?> c = ArrayList.class;
Constructor<?>[] constructors = c.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println("Constructor with " + constructor.getParameterCount() + " parameter(s)");
for (Class<?> type : constructor.getParameterTypes()) {
System.out.println(" " + type.getName());
}
}
}
}
输出结果(JDK 17+):
Constructor with 1 parameter
java.util.Collection
Constructor with 0 parameter
Constructor with 1 parameter
int
📌 说明:
-
ArrayList(Collection<? extends E> c)→ 被擦除成Collection -
ArrayList(int initialCapacity)→ 参数类型是int -
ArrayList()→ 无参构造器
2. 获取泛型参数类型
如果想保留泛型信息,可以使用 getGenericParameterTypes():
Class<?> c = ArrayList.class;
Constructor<?>[] constructors = c.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println("Constructor with " + constructor.getParameterCount() + " parameter(s)");
for (Type type : constructor.getGenericParameterTypes()) {
System.out.println(" " + type.getTypeName());
}
}
输出结果:
Constructor with 1 parameter
java.util.Collection<? extends E>
Constructor with 0 parameter
Constructor with 1 parameter
int
📌 说明:
- 这里泛型信息得以保留:
Collection<? extends E> - 但由于 Java 的 泛型擦除,运行时你依然无法区分
ArrayList<String>和ArrayList<Integer>的构造器,反射只能看到泛型声明本身。
3. 总结
- ✅
getParameterTypes()→ 获取参数的 原始类型(泛型擦除后) - ✅
getGenericParameterTypes()→ 获取参数的 泛型类型(声明信息) - ✅ ArrayList 示例展示了三种常见构造器:无参、容量型、集合拷贝型