浅论泛型与反射机制结合(hibernate)

     我相信在做hibernate高手都会发现很多dao类,而且这类dao类有很大的冗余。加大维护和测试量,而最终也做了很多无用功的测试和维护,这里我只做个简单演示,我在做项目的心得而已,欢迎批评指教。

    首先我们建立接口:

 

写道
public interface IEntityDao <T> {
public void saveEntity(T t);

public <T> T getEntityById(long id);

}

 对接口的实现:

写道
public class EntityDaoImpl<T> implements IEntityDao<T> {

private Class<T> clazz;

public EntityDaoImpl() {
//特别就在这里,T的类型没有确定程序就会报错
clazz = GenericUtils.getSuperClassGenericType(this.getClass());
}

public <T> T getEntityById(long id) {
System.out.println(clazz);
return null;
}

public void saveEntity(T t) {
System.out.println(t);

}

}

   上面泛型我们是用到了,那么如何来确定T的类型,这里就用到了反射机制

反射机制代码:

 

写道

/**
* 泛型的常用类,这里通过反射,获取父类的参数类型,获取父类的参数类型其实就是Class类型
* 这里就hiberante为例子,一般来说做数据库dao层开发有很多的pojo,如果为每一个pojo做一个持久层,那么 代码是很冗余的。
* 假如:有Customer ,Manager两个类,可能就会有CustomerDao,ManagerDao 那么内面的代码就会有很冗余,
* 但是用反射机制动态来确定运行时的类型就可以解决类的冗余问题假设用到hibernate , GenericsDao<T> T代表泛型,例如 T
* 可以是Customer ,Manager。 对于ManagerDao我们就可以这样写 ManagerDao extends
* GenericsDao<Manager>
*
* @author Administrator
*
*/
public class GenericUtils {
private GenericUtils() {

}

/**
* 获取父类的参数类型
*
* @param clazz
* @param index
* 指泛型引索
* @return
*/
public static Class getSuperClassGenericType(Class clazz, int index) {
Type type = clazz.getGenericSuperclass();
if (!(type instanceof ParameterizedType)) {
return Object.class;
}
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
if (index >= types.length || index < 0) {
return Object.class;
}
if (types[index] instanceof Class) {
return Object.class;
}
return (Class) types[index];
}

public static Class getSuperClassGenericType(Class clazz) {
return getSuperClassGenericType(clazz, 0);
}

}

    注释写得很清楚我就不用多说,下面就看看如何来用它,代码如下:

写道
public class ManagerDao extends EntityDaoImpl<Manager> {

}
public class CustomerDao extends EntityDaoImpl<Customer> {

}

 看上面避免了很多重复代码只需要一个简单的继承而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值