首页 > 代码库 > java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用
java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用
当项目是ssh框架时,每一个Action会对应一个Service和一个Dao。但是所有的Ation对应的Dao中的方法是相同的,只是要查的表不一样。由于封装的思想,为了提高代码的重用性。可以使用java中的泛型+反射去实现最终的封装,将所有的Dao层的共同部分写一个BaseDaoUtil。而所有的Dao都继承这个类。
思路:
----->(1)反射+泛型
----->(2)当生成子类对象(UserDao),调用空构造时(new UserDao()),子类的空构造会默认调用父类的空构造器(new BaseDaoUtil())
----->(3)在父类的空构造器中利用反射机制,获取每个dao层指定的泛型(public class UserDao extends BaseDaoUtil<User,Dog>{}),然后应用到父类中。
----->(4)只要能获取一个类的class对象,则可以通过反射对该类进行所有操作
第一步:定义BaseDaoUtil类
1 /** 2 * 封装的Dao层的工具类 3 * @ClassName: BaseDaoUtil 4 * @Description: TODO(这里用一句话描述这个类的作用) 5 * @author 尚晓飞 6 * @date 2014-7-14 上午9:01:25 7 * 8 * @param <T1> 9 * @param <T2>10 */11 public class BaseDaoUtil<T1,T2> {12 private Class<T1> cls1;13 private Class<T2> cls2;14 15 /**16 * 不同dao层继承该类,会确定不同的泛型。17 * 通过泛型+反射实现这一功能18 * 当生成每一个dao层类的对象是,空构造里会自动调用父类,也就是BaseDaoUtil的空构造器19 * 而BaseDaoUtil的空构造器中利用反射机制,获取泛型指定的类型,从而确定下来每个dao层调用该工具类的方法时,是确定的类型数据。20 * 泛型+反射的应用之一21 * @Title: EncodingRequestWrapper 22 * @Description: 构造函数23 * @author 尚晓飞24 * @date 2014-7-14 上午8:56:0225 */26 @SuppressWarnings("unchecked")27 public BaseDaoUtil(){28 //获取当前对象的参数化类型列表的Type29 Type type=this.getClass().getGenericSuperclass();30 //多态 type是ParameterizedType的父接口,31 if(type instanceof ParameterizedType){32 ParameterizedType parameterizedType=(ParameterizedType) type;33 //type2数组中装的时T1,T2的实际类型34 Type[] type2=parameterizedType.getActualTypeArguments();35 //Class是type接口的唯一实现类,可以向下转型。多态36 this.cls1=(Class<T1>) type2[0];37 this.cls2=(Class<T2>) type2[1];38 }39 }40 41 /**42 * 测试当生成userDao对象时,是否通过父类BaseDaoUtil确定下来类型43 * @Title: test 44 * @Description: TODO(这里用一句话描述这个方法的作用) 45 * @return void 返回类型 46 * @author 尚晓飞47 * @date 2014-7-14 上午9:15:5448 */49 public void test(){50 //获取类名(不含包名)51 System.out.println("BaseDaoUtil.test(第一个参数类型)"+cls1.getSimpleName());52 System.out.println("BaseDaoUtil.test(第二个参数类型)"+cls2.getSimpleName());53 }54 }
第二步:让不同的dao层类继承该BaseDaoUtil类,在继承时指定需要的泛型
1 /** 2 * 这是其中一个dao层类,继承了封装的工具类BaseDaoUtil 3 * 在继承时提供UserDao需要操作的类,也就是泛型的参数化类型 4 * @ClassName: UserDao 5 * @Description: TODO(这里用一句话描述这个类的作用) 6 * @author 尚晓飞 7 * @date 2014-7-14 上午9:00:29 8 * 9 * @param <User>10 * @param <Dog>11 */12 public class UserDao extends BaseDaoUtil<User, Dog>{13 14 }
第三步:进行测试
1 public class Test { 2 3 public static void main(String[] args) { 4 //生成userDao对象时,会先调用父类BaseDaoUtil的空构造,确定泛型 5 UserDao userDao=new UserDao(); 6 userDao.test(); 7 8 9 }10 }11 //打印结果12 //BaseDaoUtil.test(第一个参数类型)User13 //BaseDaoUtil.test(第二个参数类型)Dog
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。