// 1. 直接Class: 这种写法纯属骗人,从类图可以看出,就算用父接口引用,其实本质上还是Class类型 // 和ParameterizedType类型不符。 DataEntity<User> dataEntity = new DataEntity<User>(); Type t = (Type)dataEntity.getClass();
// 2. 通过class.getGenericSuperclass():这种方式可以获取到的的确是ParameterizedType, // 但那是父类的ParameterizedType(如果父类是泛型的情况)。 // 那么如果A继承B,B能获取到A的class, 再通过A的class获取到B的泛型参数, 虽然有点绕, 但也不失为一种方式。 List<String> list = new ArrayList<String>(); Type type =list.getClass().getGenericSuperclass();
// 3.通过反射获取: 反射是根据类来获取对应的属性,这种方式下获取的是泛型前的类型TypeVariable // 如果某个方法中的参数是泛型类型, 通过method.getGenericParameterTypes()可以获取到ParameterizedType DataEntity<User> dataEntity = new DataEntity<User>(); try{ Field field = dataEntity.getClass().getField("data"); Type paraType = field.getGenericType(); System.out.println(paraType); }catch(Exception e){ e.printStackTrace(); }
@Test publicvoidtestAA(){ B b = new B(); Type[] type = b.getClass().getGenericInterfaces(); System.out.println(((ParameterizedType)type[0]).getActualTypeArguments()[0]); }