獲取泛型的真實類型,分爲如下兩種形式:java
假設,咱們有一個Generic<T>
類和Main
類code
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
源碼中的示例。