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:02
25      */
26     @SuppressWarnings("unchecked")
27     public BaseDaoUtil(){
28         //获取当前对象的参数化类型列表的Type
29         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:54
48      */
49     public void test(){
50         //获取类名(不含包名)
51         System.out.println("BaseDaoUtil.test(第一个参数类型)"+cls1.getSimpleName());
52         System.out.println("BaseDaoUtil.test(第二个参数类型)"+cls2.getSimpleName());
53     }
54 }

View Code

第二步:让不同的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 }

View Code

第三步:进行测试

 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(第一个参数类型)User
13 //BaseDaoUtil.test(第二个参数类型)Dog

View Code

 

 

时间: 2025-01-28 09:21:24

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

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

利用java反射机制实现自动调用类的简单方法_java

1. 新建TestServlet类 package com.yanek.test; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.ht

java 反射 java.lang.IllegalArgumentException

问题描述 java 反射 java.lang.IllegalArgumentException package cn.com.reflect; public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() {

利用java反射机制实现自动调用类的方法

 1. 新建TestServlet类 package com.yanek.test; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.h

java反射-java能在运行期间通过反射去改变方法的返回值么?

问题描述 java能在运行期间通过反射去改变方法的返回值么? java能在运行期间通过反射去改变方法的返回值么?有demo可参考么

java反射-java 非空对象转map可行吗?

问题描述 java 非空对象转map可行吗? map objToMap(Object obj,Class clazz){ //返回一个 obj属性–obj属性对应值 的map } 或者 map objToMap(Object obj){ //返回一个 obj属性–obj属性对应值 的map } 不知道可不可以?有没有具体实现或者方法 解决方案 可以.参考http://blog.csdn.net/bober/article/details/5807440 解决方案二: http://www.cnb

深入理解Java反射_java

要想理解反射的原理,首先要了解什么是类型信息.Java让我们在运行时识别对象和类的信息,主要有2种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息:另一种是反射机制,它允许我们在运行时发现和使用类的信息. 1.Class对象 理解RTTI在Java中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息.Class对象就是用来创建所有"常规"对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似

java反射深入剖析(推荐)_java

本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ //other codes... } class hello{ public static void main(String[] args) { Demo demo

聊一聊Java反射_java

这次提到的Java反射涉及的代码比较多.因为工作中经常用到反射,对代码做了很多抽象以及过滤器.虽然代码量很多,但是简单易用,过滤插件也易修改. 下面介绍下工作中哪些地方比较容易用到反射.比如插件或者过滤器,如果抽象的子类比较少,配置成XML等结构也是可以达到同样的效果.如果希望灵活一些,添加了插件或者过滤器代码子类后希望可以直接使用.可能反射会比较好点,通过扫描所有class或者jar文件,得到所有继承的子类.如果每次调用都扫描所有的文件会比较影响性能.所以在实现里面加入反射缓存,对所要获取反射