getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
这里还需要将其转换为ParameterizedType ,即:ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();
getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。
[0]就是这个数组中第一个了
简而言之就是获得超类的泛型参数的实际类型
比如
接口:
public interface BaseDao<T> {
/**
* 保存
* @param entity
*/
public void save(T entity);
}
实现接口的类
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;
private Class<T> clazz ;//这是一个问题
public BaseDaoImpl(){
//使用反射技术得到类的类型
ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();//获取当前new的对象的泛型的对象类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真是类型
}
public Session getSession(){
return sessionFactory.getCurrentSession();
}
@Override
public void save(T entity) {
Session session = this.getSession();
session.save(entity);
}
}
子类
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
}
测试类
public class BaseDaoTest {
@Test
public void testSave() {
UserDao userDao = new UserDaoImpl();
}
}
这样在你new UserDaoImpl();以后;超类里的
getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type然后将其转换ParameterizedType。。getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。。简而言之就是获得超类的泛型参数的