获取java泛型真实类型的方式

获取java泛型真实类型的方式

获取泛型的真实类型,分为如下两种形式:java

一、获取类的泛型的真实类型

假设,咱们有一个Generic<T>类和Maincode

class Generic<T> {

}
public class Main extends Generic<String> {

}

如何在Main类中获取到父类泛型的实际类型呢?继承

能够经过以下方式获取:get

class Generic<T> {

}

public class Main extends Generic<String> {

    public static void main(String[] args) {
        // 具体参数类型
        Main testClass = new Main();
        System.out.println(getGenericType(testClass.getClass()));
    }
    /**
     * 获取所继承类的泛型实际类型
     *
     * @param declaredClass 传入Class实例
     * @return 泛型实际类型
     */
    private static Class getGenericType(Class declaredClass) {
        ParameterizedType parameterizedType = (ParameterizedType) declaredClass.getGenericSuperclass();
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        return (Class) actualTypeArguments[0];
    }

}

还有另外一种状况,咱们有一个Person<T>源码

public class Person<T> {

}

如何获取到当前类上的泛型呢?io

能够经过以下方式获取到定义在类上的泛型名称,下面代码会打印出T。编译

public class Person<T> {

    public static void main(String[] args){
        TypeVariable[] parameters = Person.class.getTypeParameters();
        for (TypeVariable typeVariable : parameters) {
            System.out.println(typeVariable);
        }
    }

}

可是,咱们要获取像下面代码中的泛型,暂时没有找到解决方案class

Person<String> person = new Person<>();

不过,经过查看编译后的字节码文件,发现类型信息保留在字节码中,能够经过字节码反推的形式获取到,那就很复杂了。test

二、获取类字段上泛型的真实类型

对于在字段上,复杂形式的泛型,咱们能够经过Spring-core中的ResolvableType类帮助咱们解析。泛型

public class Main {

    private List<Map<String, List<Object>>> list = new ArrayList<>();

    public static void main(String[] args) throws NoSuchFieldException {
        // 获取成员泛型参数类型
        Field field = Main.class.getDeclaredField("list");
        ResolvableType resolvableType = ResolvableType.forField(field);
        System.out.println(resolvableType.getGeneric(0));
    }

}

具体使用能够查看ResolvableType源码中的示例。

相关文章
相关标签/搜索