能否提供一个简明易懂的例子,展示如何在Java反射中使用ParameterizedType?
时间: 2024-12-23 13:23:05 浏览: 3
当然可以。在Java中,`ParameterizedType`是一个表示泛型类型的元数据类,它包含了泛型的实际类型参数信息。这里通过一个简单的例子来说明:
假设我们有一个`List<User>`类型的列表,其中`User`是一个泛型类:
```java
import java.lang.reflect.ParameterizedType;
import java.util.List;
class User<T> {
private T data;
public User(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
public class Main {
public static void main(String[] args) {
List<User<String>> userList = new ArrayList<>(); // 实际上存储字符串类型的User对象
// 获取List<User<String>>的类型信息
ParameterizedType parameterizedType = userList.getClass().getGenericSuperclass();
// 参数化类型是一个ParameterizedType对象,我们可以从它获取具体的类型参数
Type typeArgument = parameterizedType.getActualTypeArguments()[0];
// 判断是否为ParameterizedType
if (typeArgument instanceof ParameterizedType) {
ParameterizedTypeGenericType genericType = (ParameterizedTypeGenericType) typeArgument; // 假设我们自定义了一个ParameterizedTypeGenericType 类别
Class<?> rawClass = ((Class<?>) genericType.getRawType()).getTypeParameters()[0]; // 获取原始类型参数
System.out.println("Raw class: " + rawClass.getName()); // 输出 User.class
Type[] actualTypeArgs = genericType.getActualTypeArguments(); // 获取实际类型参数
Class<?> concreteType = (Class<?>) actualTypeArgs[0]; // 获取具体类型参数
System.out.println("Concrete type: " + concreteType.getName()); // 输出 String.class
}
}
}
```
在这个例子中,`parameterizedType`是一个`ParameterizedType`对象,通过`getActualTypeArguments()`方法可以获得泛型的类型参数,进一步判断并获取实际的类型类。这样就可以在运行时动态处理各种类型参数化的对象了。
阅读全文