運行時獲取泛型T的類型

今天寫web項目的dao層時出現的一個問題,hibernate getcurrentSession 有獲取對象的方法 get(class,id) 在dao層中定義了泛型T,可是dao中的get方法須要知道T 是哪一個class 問題就誕生了,網上後來找到了一下方法:java

protected Class<T> getTclass() {
		if (clazz == null) {   
			clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		}
		return clazz;
	}

因而在dao層中的構造函數直接調用該方法以便獲取class對象,這樣的話獲取對象的方法get裏就直接能夠傳遞該class。web

結果運行時報一下錯誤:spring

 

Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
	at com.younchen.server.imp.BaseServerImp.<init>(BaseServerImp.java:32)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
	... 37 more

後來才明白 這段代碼使用前提是 繼承該方法所在的類,好比說 class A 裏面有此方法,那麼想調用該方法就建立一個 classB extends classA  而後 經過 classB的getTclass()方法獲取。函數

除此以外還有一種方法能夠獲取泛型T的類型 那就是寫一個方法將泛型T做參數傳遞進去例如: function(T o) 在方法體中經過o.getclass() 方法獲取。spa

相關文章
相關標籤/搜索