运行时获取泛型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

相关文章
相关标签/搜索