Java反射获取List的泛型
时间: 2023-10-18 11:02:14 浏览: 47
要获取一个List的泛型类型,可以使用Java反射提供的Type接口的getActualTypeArguments()方法。
假设我们有一个List对象,其类型为List<String>,可以使用以下代码获取其泛型类型:
```
List<String> list = new ArrayList<String>();
Type type = list.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
Type actualType = actualTypeArguments[0];
System.out.println(actualType);
}
```
这段代码首先获取List对象的Class类型,然后调用getGenericSuperclass()方法获取其父类的Type类型。如果这个Type是ParameterizedType(即带有泛型参数的类型),则通过getActualTypeArguments()方法获取实际的泛型参数类型数组,这里我们只有一个泛型参数,所以直接获取数组的第一个元素即可。最后打印出来的结果应该是java.lang.String。
相关问题
java17 反射获取泛型类型
在Java 17中,可以使用反射来获取泛型类型。面是一种常见的方法:
1. 首先,通过反射获取目标类的Class对象。假设目标类为`MyClass`,可以使用`MyClass.class`或者`Class.forName("com.example.MyClass")`来获取。
2. 使用`getDeclaredField`方法获取目标字段的Field对象。假设目标字段为`myField`,可以使用`Class.getDeclaredField("myField")`来获取。
3. 通过Field对象的`getGenericType`方法获取字段的泛型类型。这将返回一个Type对象,表示字段的实际类型。
4. 如果字段的类型是参数化类型(即包含泛型参数),可以通过Type对象的一些方法来获取泛型参数的信息。例如,可以使用`ParameterizedType`接口来获取参数化类型的原始类型和泛型参数列表。
下面是一个示例代码,演示了如何使用反射获取泛型类型:
```java
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) throws NoSuchFieldException {
// 获取目标类的Class对象
Class<MyClass> clazz = MyClass.class;
// 获取目标字段的Field对象
Field field = clazz.getDeclaredField("myField");
// 获取字段的泛型类型
Type fieldType = field.getGenericType();
// 如果字段的类型是参数化类型
if (fieldType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) fieldType;
// 获取参数化类型的原始类型
Type rawType = parameterizedType.getRawType();
System.out.println("Raw type: " + rawType);
// 获取参数化类型的泛型参数列表
Type[] typeArguments = parameterizedType.getActualTypeArguments();
for (Type typeArgument : typeArguments) {
System.out.println("Type argument: " + typeArgument); }
}
}
}
class MyClass {
private List<String> myField;
}
```
在上面的示例中,我们通过反射获取了`MyClass`类中名为`myField`的字段的泛型类型。输出结果如下:
```
Raw type: interface java.util.List
Type argument: class java.lang.String
```
这表明`myField`字段的类型是`List<String>`,其中`List`是原始类型,`String`是泛型参数。
Java获取List 泛型类型
在Java中,可以通过反射机制获取List的泛型类型。具体来说,可以通过以下步骤获取List的泛型类型:
1. 获取List属性对应的Field对象;
2. 通过Field对象的getGenericType()方法获取属性的泛型类型;
3. 判断泛型类型是否为ParameterizedType类型;
4. 如果是ParameterizedType类型,则通过getActualTypeArguments()方法获取泛型参数的类型。
举个例子,假设有一个类中有一个List属性,可以通过以下代码获取List的泛型类型:
```
Field field = MyClass.class.getDeclaredField("myList");
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
if (actualTypeArguments.length > 0) {
Class<?> listGenericType = (Class<?>) actualTypeArguments[0];
System.out.println("List泛型类型为:" + listGenericType.getName());
}
}
```