今天寫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