对于Class而言T已经被擦拭为Object,而真正的T参数被转到使用T的方法 (或者变量声明或者其它使用T的地方)里面(若是没有那就没有存根),因此没法反射到T的具体类别,也就没法获得T.class。而 getGenericSuperclass()是Generic继承的特例,对于这种状况子类会保存父类的Generic参数类型,返回一个 ParameterizedType,这时能够获取到父类的T.class了,这也正是子类肯定应该继承什么T的方法。java
public class param<T1, T2> { class A {} class B extends A {} private Class<T1> entityClass; protected param (){ Type type = getClass().getGenericSuperclass(); System.out.println("getClass()==" + getClass()); System.out.println("type = " + type); Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0]; System.out.println("trueType1 = " + trueType); trueType = ((ParameterizedType)type).getActualTypeArguments()[1]; System.out.println("trueType2 = " + trueType); this.entityClass = (Class<T1>)trueType; B t = new B(); type = t.getClass().getGenericSuperclass(); System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length); } }
public class subParam extends param<Myclass, Myinvoke> { public static void main(String[] args) throws Exception{ subParam s = new subParam(); } }
输出:this
getClass()==class com.example.test.subParam
type = com.example.test.param<com.example.test.Myclass, com.example.test.Myinvoke>
trueType1 = class com.example.test.Myclass
trueType2 = class com.example.test.Myinvoke
B is A's super class :0spa
贴一个看到代码code
public class RawDao<T> { protected Class<T> clazz; @SuppressWarnings("unchecked") public RawDao() { @SuppressWarnings("rawtypes") Class clazz = getClass(); while (clazz != Object.class) { Type t = clazz.getGenericSuperclass(); if (t instanceof ParameterizedType) { Type[] args = ((ParameterizedType) t).getActualTypeArguments(); if (args[0] instanceof Class) { this.clazz = (Class<T>) args[0]; break; } } clazz = clazz.getSuperclass(); } }