對於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(); } }