Java高级应用之通过反射操作泛型
在Java中,可以使用反射来操作泛型。通过反射,可以获取泛型的类型信息,以及动态创建泛型对象。
在Java中,泛型是编译时类型擦除的,即在编译时会将泛型的类型信息擦除,转换成普通的Object类型。但是通过反射,可以在运行时获取泛型的类型信息。
下面是一个示例代码,演示如何通过反射操作泛型:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class GenericReflectionDemo<T> {
private T value;
public GenericReflectionDemo(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public static void main(String[] args) {
// 创建一个带有泛型参数的List对象
List<String> list = new ArrayList<String>();
// 通过反射获取List的类型信息
Type type = list.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] typeArguments = parameterizedType.getActualTypeArguments();
if (typeArguments.length > 0) {
// 获取泛型参数的类型信息
Type typeArgument = typeArguments[0];
System.out.println("泛型参数类型: " + typeArgument.getTypeName());
}
}
// 创建一个带有泛型参数的对象
GenericReflectionDemo<String> demo = new GenericReflectionDemo<String>("Hello");
// 通过反射获取对象的类型信息
Type objectType = demo.getClass().getGenericSuperclass();
if (objectType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) objectType;
Type[] typeArguments = parameterizedType.getActualTypeArguments();
if (typeArguments.length > 0) {
// 获取泛型参数的类型信息
Type typeArgument = typeArguments[0];
System.out.println("泛型参数类型: " + typeArgument.getTypeName());
}
}
}
}
运行结果:
泛型参数类型: java.lang.String
泛型参数类型: java.lang.String
通过反射,我们可以获取List对象的泛型参数类型为String,以及使用泛型实例化对象的泛型参数类型也为String。这样我们就可以在运行时获取泛型的类型信息,并做出相应的操作。