当项目是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类

 /**
* 封装的Dao层的工具类
* @ClassName: BaseDaoUtil
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-7-14 上午9:01:25
*
* @param <T1>
* @param <T2>
*/
public class BaseDaoUtil<T1,T2> {
private Class<T1> cls1;
private Class<T2> cls2; /**
* 不同dao层继承该类,会确定不同的泛型。
* 通过泛型+反射实现这一功能
* 当生成每一个dao层类的对象是,空构造里会自动调用父类,也就是BaseDaoUtil的空构造器
* 而BaseDaoUtil的空构造器中利用反射机制,获取泛型指定的类型,从而确定下来每个dao层调用该工具类的方法时,是确定的类型数据。
* 泛型+反射的应用之一
* @Title: EncodingRequestWrapper
* @Description: 构造函数
* @author 尚晓飞
* @date 2014-7-14 上午8:56:02
*/
@SuppressWarnings("unchecked")
public BaseDaoUtil(){
//获取当前对象的参数化类型列表的Type
Type type=this.getClass().getGenericSuperclass();
//多态 type是ParameterizedType的父接口,
if(type instanceof ParameterizedType){
ParameterizedType parameterizedType=(ParameterizedType) type;
//type2数组中装的时T1,T2的实际类型
Type[] type2=parameterizedType.getActualTypeArguments();
//Class是type接口的唯一实现类,可以向下转型。多态
this.cls1=(Class<T1>) type2[0];
this.cls2=(Class<T2>) type2[1];
}
} /**
* 测试当生成userDao对象时,是否通过父类BaseDaoUtil确定下来类型
* @Title: test
* @Description: TODO(这里用一句话描述这个方法的作用)
* @return void 返回类型
* @author 尚晓飞
* @date 2014-7-14 上午9:15:54
*/
public void test(){
//获取类名(不含包名)
System.out.println("BaseDaoUtil.test(第一个参数类型)"+cls1.getSimpleName());
System.out.println("BaseDaoUtil.test(第二个参数类型)"+cls2.getSimpleName());
}
}

第二步:让不同的dao层类继承该BaseDaoUtil类,在继承时指定需要的泛型

 /**
* 这是其中一个dao层类,继承了封装的工具类BaseDaoUtil
* 在继承时提供UserDao需要操作的类,也就是泛型的参数化类型
* @ClassName: UserDao
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-7-14 上午9:00:29
*
* @param <User>
* @param <Dog>
*/
public class UserDao extends BaseDaoUtil<User, Dog>{ }

第三步:进行测试

 public class Test {

     public static void main(String[] args) {
//生成userDao对象时,会先调用父类BaseDaoUtil的空构造,确定泛型
UserDao userDao=new UserDao();
userDao.test(); }
}
//打印结果
//BaseDaoUtil.test(第一个参数类型)User
//BaseDaoUtil.test(第二个参数类型)Dog

java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用的更多相关文章

  1. Java反射给泛型集合赋值

    Java反射给泛型集合赋值 泛型 Java泛型简单描述下: 比如创建一个List集合,我想在里边只放Student对象信息,就需要写成 List<Student> studentList ...

  2. Java反射,泛型在Json中的运用

    最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍.java中的反射无疑就相当于java开发者的春天,在众多的 ...

  3. 2015第22周六Java反射、泛型、容器简介

    Java的反射非常强大,传递class, 可以动态的生成该类.取得这个类的所有信息,包括里面的属性.方法以及构造函数等,甚至可以取得其父类或父接口里面的内容. obj.getClass().getDe ...

  4. java 反射和泛型

    反射 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 要注意术 ...

  5. 深入分析Java反射(三)-泛型

    前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...

  6. java 反射 子类泛型的class

    很早之前写过利用泛型和反射机制抽象DAO ,对其中获取子类泛型的class一直不是很理解.关键的地方是HibernateBaseDao的构造方法中的 Type genType = getClass() ...

  7. java反射获取和设置实体类的属性值 递归所有父类

    最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...

  8. 浅析Java反射--Java

    前言 上篇文章我们提到了可以使用反射机制破解单例模式.这篇文章我们就来谈一谈什么是反射,反射有什么用,怎么用,怎么实现反射. 概述 Java的反射(reflection)机制:是指在程序的运行状态中, ...

  9. java反射 java动态代理和cglib动态代理的区别

    java反射      https://blog.csdn.net/f2764052703/article/details/89311013 java 动态代理   https://blog.csdn ...

随机推荐

  1. WPF几种高级绑定

    (1)Binding  + RelativeSource + AncestorType 模式  , 根据关联源所指定的类型,可动态绑定指定类型的Path属性(Path可以省略)(PS:动态指父级在运行 ...

  2. 卸载 PrestaShop 1.7

    PrestaShop 的卸载非常简单: 在你的 Web 服务器上删除所有 PrestaShop 的文件和目录.你可以使用 FTP 客户端,你也可以使用 SSH 工具. 使用数据库工具删除数据库中所有以 ...

  3. dp练习(2)——老鼠的旅行

    1267 老鼠的旅行(来源:codevs) #include "bits/stdc++.h" using namespace std; ][]; ][]; int main() { ...

  4. OAF中trunc函数的使用(转)

    原文地址:OAF中trunc函数的使用 需求:在做OAF开发时,经常会需要查询功能,由于需求的不同,往往不能使用OAF标准的查询功能,需要自己客户化实现查询功能,而在查询功能中,经常会遇到查询的时间范 ...

  5. spring cloud 学习(一)初学SpringCloud

    初学SpringCloud 前言 在SpringBoot的坑还没填完的情况下,我又迫不及待地开新坑了.主要是寒假即将结束了,到时又得忙于各种各样的事情……留个坑给自己应该就会惦记着它,再慢慢地补上…… ...

  6. USART相关问题

    最近发现一个FT232+stm32的USB转串口问题,不能理解,记录下来. PC和STM32通讯,USB-B连接,连接方式如下所示: 上图为USB口引出USB_N/USB_P/USB_EN三个PIN脚 ...

  7. PHP:php中的双引号和单引号的区别

    双引号: $a="369"; $b="$a"; echo $b;//输出:369 单引号: $a="369"; $b='$a'; echo ...

  8. SPOJ AMR10I 递归

    DES :给你n 块石头.不会超过70.把它们分成n堆.每堆里的石头数做积.问共有多少个数.最终的结果除了1之外都能分解成素数相乘或者素数相乘再乘1.所以可以找到所有不超过70的素数然后进行深搜. 感 ...

  9. [置顶]使用scrapy_redis,自动实时增量更新东方头条网全站新闻

    存储使用mysql,增量更新东方头条全站新闻的标题 新闻简介 发布时间 新闻的每一页的内容 以及新闻内的所有图片.项目文件结构. 这是run.py的内容 1 #coding=utf-8 2 from ...

  10. [Android Studio] Android Studio常用快捷键

    [Android Studio] Android Studio常用快捷键   (会持续更新)这边讲的常用快捷键是指做完Keymap到Eclipse后的,不是纯Android Studio的,这边主要讲 ...