MST

星途 面试题库

面试题:Java中Java泛型反射机制下如何获取泛型类型信息

假设你有一个包含泛型类型的类,例如`class GenericClass<T> {}`,使用Java反射机制,如何获取实例化`GenericClass`时传入的实际泛型类型?
49.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 对于这种情况,可以通过获取类的ParameterizedType来获取实际的泛型类型。以下是示例代码:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

class GenericClass<T> {}

class Main {
    public static void main(String[] args) {
        GenericClass<String> genericClass = new GenericClass<>();
        Type genericSuperclass = genericClass.getClass().getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println("实际的泛型类型: " + actualTypeArgument);
            }
        }
    }
}
  1. 在上述代码中:
    • 首先获取GenericClass实例的genericSuperclass,这将返回该类的直接超类的Type对象。
    • 检查genericSuperclass是否为ParameterizedType,如果是,说明该类是参数化类型(即包含泛型)。
    • 然后通过ParameterizedTypegetActualTypeArguments方法获取实际的泛型类型参数,并将其打印出来。

需要注意的是,如果GenericClass不是直接继承自Object(例如继承了另一个泛型类),上述代码获取的是其直接超类的泛型参数。如果要获取GenericClass本身声明的泛型参数,需要从类的声明处获取,如下代码:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

class GenericClass<T> {}

class Main {
    public static void main(String[] args) {
        Type genericType = GenericClass.class.getGenericSuperclass();
        if (genericType instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println("实际的泛型类型: " + actualTypeArgument);
            }
        }
    }
}

这种方式获取的是GenericClass声明的泛型参数,而不依赖于具体实例化的对象。不过在实际应用中,获取实例化时传入的泛型类型更常见。