獲取在介面或者類上定義的泛型型別
阿新 • • 發佈:2019-01-24
通過Class類上的 getGenericSuperclass() 或者 getGenericInterfaces() 獲取父類或者介面的型別,然後通過ParameterizedType.getActualTypeArguments()
可以得到定義在類或者介面上的泛型型別,具體參考如下程式碼:
/* * To change this template use File | Settings | Editor | File and Code Templates */ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericTypeTest { static class Test1 extends T<Person, Animal> { } static class Test2 implements I<Person, Animal>, I2<Fruit> { } public static void main(String[] args) { //獲取類定義上的泛型型別 Test1 test1 = new Test1(); Type types = test1.getClass().getGenericSuperclass(); Type[] genericType = ((ParameterizedType) types).getActualTypeArguments(); for (Type t : genericType) { System.out.println(t.getTypeName()); } System.out.println("==============================================="); //獲取介面定義上的泛型型別 Test2 test2 = new Test2(); //一個類可能實現多個介面,每個介面上定義的泛型型別都可取到 Type[] interfacesTypes = test2.getClass().getGenericInterfaces(); for (Type t : interfacesTypes) { Type[] genericType2 = ((ParameterizedType) t).getActualTypeArguments(); for (Type t2 : genericType2) { System.out.println(t2.getTypeName()); } } } } class T<T1, T2> { public void printT(T1 t1, T2 t2) { System.out.println(t1.getClass()); System.out.println(t2.getClass()); } } interface I<T1, T2> { } interface I2<K> { } class Person { @Override public String toString() { return "Person Type"; } } class Animal { @Override public String toString() { return "Animal Type"; } } class Fruit { @Override public String toString() { return "Fruit Type"; } }
轉自:https://www.cnblogs.com/jiaoyiping/p/6130355.html