java编译期会对泛型进行类型擦除,运行期getActualTypeArguments()是如何获得类型的
时间: 2024-02-25 14:55:29 浏览: 24
在 Java 中,泛型在编译期间会进行类型擦除,即编译器会将泛型类型转换为原始类型,例如 `List<T>` 会被转换为 `List`。但是,在运行期间,我们仍然可以通过反射机制获取泛型的类型信息。
在获取泛型类型信息时,我们需要借助 Java 中的 `Type` 接口。具体地,我们可以通过 `Field`、`Method`、`Constructor` 等反射对象的 `getGenericType()` 方法获取其类型。这个类型实际上是 `Type` 接口的实现类,其中最常用的是 `ParameterizedType` 接口,表示带有泛型信息的类型。
例如,我们可以通过以下代码获取一个类的某个字段的泛型类型信息:
```java
Field field = MyClass.class.getField("myField");
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
for (Type typeArgument : actualTypeArguments) {
System.out.println(typeArgument.getTypeName());
}
}
```
这里的 `MyClass` 是我们需要获取泛型信息的类,`myField` 是该类的一个字段名。我们首先通过 `getField()` 方法获取该字段的 `Field` 对象,然后通过 `getGenericType()` 方法获取该字段的类型。如果该字段是一个带有泛型信息的类型,那么 `genericType` 就是一个 `ParameterizedType` 对象,我们可以通过 `getActualTypeArguments()` 方法获取该泛型类型的实际类型参数。