Ⅰ java獲取泛型
這段代碼放在BaseDaoImpl中,在for循環中列印的t就是T和PK。
最後得到的persistType就是T的實際類型。
解釋一下紅色的部分:
因為this代表你的實例,
如果這個實例是(用Integer做ID的Student數據對象為例)
BaseDaoImpl<Student, Integer>studentDao=new BaseDaoImpl<Student, Integer>();
這個實例的「范型父類」(getGenericSuperclass)就是BaseDao<Student, Integer>,
如果你的實例是BaseDaoImpl<T, PK>子類的實例,
那麼「范型父類」就是BaseDaoImpl<T, PK>,
反正不是HibernateDaoSupport,因為HibernateDaoSupport不帶范型。
最後,不管是BaseDaoImpl,還是BaseDao,getActualTypeArguments()都得到Class數組,內容是{T的類型,PK的類型},取第一個(下標0),就得到T的類型(例中為Student.class)。
Ⅱ java怎麼獲取一個泛型方法的真實泛型類型
不知道我對你的題目的理解對不對:有個方法返回一個 泛型 ,你想去這個 泛型 的類型是不是?
packagetest;
importjava.util.ArrayList;
importjava.util.List;
publicclassTest01{
publicstaticvoidmain(String[]args){
List<String>strings=newArrayList<String>();
strings.add("123");//模擬返回一個泛型
System.out.println(strings.getClass());//第一次取類型
System.out.println(strings.get(0).getClass());//假如通過第一步知道是ArrayList類型,則再取類型
}
}
輸出結果:
class java.util.ArrayList
class java.lang.String
這里只舉例講一下方法,不知道是不是你想要的,
Ⅲ java獲取泛型class
很多朋友都想知道java怎麼獲取泛型class?下面侍襲就一起來了解一下吧~
獲取泛型Class的方法
Class類的方法:
public Type getGenericSuperclass()
方法作用:
如果超類是參數化類型,則返回的 Type 對象必須准確反映源代碼中所使用的實際類型參數。如果以前未曾創建表示超類的參數化類型,則創建這個類型。有關參數化老做兄類型創建過程的語義,請參閱 ParameterizedType 聲明胡好。如果此 Class 表示 Object 類、介面、基本類型或 void,則返回 null。如果此對象表示一個數組類,則返回表示 Object 類的 Class 對象。
ParameterizedType類的方法:
Type[] getActualTypeArguments()
方法作用:返回表示此類型實際類型參數的 Type 對象的數組。
注意,在某些情況下,返回的數組為空。如果此類型表示嵌套在參數化類型中的非參數化類型,則會發生這種情況。
二、獲取泛型Class對象
(解析Excel的類代碼較多,這里定義幾個簡單的類記錄)
定義獲取泛型Class對象的工具類
GenericSuperclassUtil
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericSuperclassUtil { /* * 獲取泛型類Class對象,不是泛型類則返回null */ public static Class getActualTypeArgument(Class clazz) { Class entitiClass = null; Type genericSuperclass = clazz.getGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass) .getActualTypeArguments(); if (actualTypeArguments != null && actualTypeArguments.length > 0) { entitiClass = (Class ) actualTypeArguments[0]; } } return entitiClass; } }
定義BaseService ,用來測試不使用父類時泛型Class的獲取
BaseService
public class BaseService { public Class getEntityClass() { return GenericSuperclassUtil.getActualTypeArgument(this.getClass()); } }
測試BaseService.getEntityClass() @Testpublic void testBaseService() { System.out.println(new BaseService ().getEntityClass());// 控制台輸出:null }