通过反射获取集合泛型的类型
时间: 2023-07-08 17:33:27 浏览: 277
可以通过 Java 的反射机制来获取集合的泛型类型,具体步骤如下:
1. 获取集合对象的 `Class` 对象,可以使用 `getClass()` 方法或者直接使用 `Class.forName()` 方法。
2. 获取集合对象的类型参数 `Type`,可以使用 `getGenericSuperclass()` 方法获取集合对象的超类,然后强制转换为 `ParameterizedType` 类型,从而获取类型参数 `Type`。
3. 判断类型参数是否是 `ParameterizedType`,如果是,则可以通过调用 `ParameterizedType` 的 `getActualTypeArguments()` 方法获取泛型参数类型,如果不是,则说明该类型没有泛型参数。
4. 获取泛型参数类型的具体类型,可以使用 `getTypeName()` 方法获取类型的名称,也可以使用 `getClass()` 方法获取类型的 `Class` 对象。
下面是一个示例代码,以 `List<String>` 为例:
```java
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 获取集合对象的 Class 对象
Class clazz = list.getClass();
// 获取集合对象的类型参数 Type
Type type = clazz.getGenericSuperclass();
// 判断类型参数是否是 ParameterizedType
if (type instanceof ParameterizedType) {
// 获取泛型参数类型
Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
for (Type t : actualTypeArguments) {
if (t instanceof Class) {
System.out.println("Class name: " + ((Class) t).getName());
} else {
System.out.println("Type name: " + t.getTypeName());
}
}
}
}
}
```
输出结果为:
```
Class name: java.lang.String
```
可以看到,输出的结果是泛型参数类型的 `Class` 对象,它的名称为 `java.lang.String`。如果集合中的元素类型不是简单类型,而是自定义类型,则输出的结果是自定义类型的全限定名。
阅读全文