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