如果需要在泛型類中獲取泛型類型的Class對象,可以使用以下的方法:
/**
* 通過反射, 獲得定義Class時聲明的父類的泛型參數的類型. 如無法找到, 返回Object.class.
*
*@param clazz
* clazz The class to introspect
* @param index
* the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be
* determined
*/
@SuppressWarnings("unchecked")
public static Class<Object> getSuperClassGenricType(final Class clazz, final int index) {
//返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type。
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
//返回表示此類型實際類型參數的 Type 對象的數組。
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
return Object.class;
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
如果在使用泛型的時候,沒有定義T的類型,直接使用rawType,那麼這個時候實際上還是有T的,這時候的T是Object類型。
如果直接使用rawType,在定義的泛型類中調用getSuperClassGeneric函數進行調試的時候,會發現genType還是ParameterizedType類型的,且params還是有值的,且個數與定義的泛型類型個數相等。不過這時候的泛型類型都是Object.class類型的。