代码实现
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
class GenericClass<T> {
public void printType(T t) {
// 空实现,仅为满足题目结构
}
}
public class ReflectionGenericTypeExample {
public static void main(String[] args) {
GenericClass<Integer> integerGenericClass = new GenericClass<>();
Class<?> genericClass = integerGenericClass.getClass();
Type genericSuperclass = genericClass.getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type type : actualTypeArguments) {
System.out.println("实际类型: " + type.getTypeName());
}
}
}
}
实现过程中遇到的挑战及解决方案
- 挑战:Java的泛型是一种编译时机制,在运行时类型信息会被擦除,即
GenericClass<T>
在运行时变成GenericClass
,无法直接获取泛型参数T
的实际类型。
- 解决方案:
- 使用反射的
ParameterizedType
接口。通过getGenericSuperclass()
方法获取泛型超类,然后判断其是否为ParameterizedType
。
- 如果是
ParameterizedType
,可以通过getActualTypeArguments()
方法获取实际的类型参数,这些参数就是泛型中具体的类型,从而实现运行时获取泛型类型信息。