1. dao层
以Hibernate为例
首先定义了一个类
java 代码
- public class HibernateGenericDao extends HibernateDaoSupport
HibernateGenericDao 具有CRUD等基本功能。
又定义了一个供所有实体对象对应的Service层继承的类:
java 代码
- HibernateEntityDao< T > extends HibernateGenericDao implements EntityDao< T >
这里用到了jdk5.0里的范型,当一个实体对象对应的Service层继承该类时,比如:
java 代码
- public class UserManager extends HibernateEntityDao < User >
会把User这个实体对象传递给HibernateEntityDao.
当UserManager被实例化时,首先会去调用其父类的构造函数,HibernateEntityDao的构造函数里的代码如下:
java 代码
- protected Class<t></t> entityClass;// DAO所管理的Entity类型.
- /**
- * 在构造函数中将泛型T.class赋给entityClass.
- */
- public HibernateEntityDao() {
- entityClass = GenericsUtils.getSuperClassGenricType(getClass());
- }
java 代码
- public static Class getSuperClassGenricType(Class clazz) {
- return getSuperClassGenricType(clazz, 0);
- }
java 代码
- public static Class getSuperClassGenricType(Class clazz, int index) {
- //返回表示此 Class 所表示的实体的直接超类的 Type,也就是extends的类。不包含implements的
- //Type是Class的父类
- Type genType = clazz.getGenericSuperclass();
- if (!(genType instanceof ParameterizedType)) {
- log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
- return Object.class;
- }
- //返回表示此类型实际类型参数的 Type 对象的数组,数组里放的都是对应类型的Class
- Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
- if (index >= params.length || index < 0) {
- log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
- + params.length);
- return Object.class;
- }
- if (!(params[index] instanceof Class)) {
- log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
- return Object.class;
- }
- return (Class) params[index];
- }