獲取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源碼中的示例。

相關文章
相關標籤/搜索