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

简介: 当项目是ssh框架时,每一个Action会对应一个Service和一个Dao。但是所有的Ation对应的Dao中的方法是相同的,只是要查的表不一样。由于封装的思想,为了提高代码的重用性。可以使用java中的泛型+反射去实现最终的封装,将所有的Dao层的共同部分写一个BaseDaoUtil。

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

 

 

相关文章
|
24天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
42 8
|
23天前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
24天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
46 1
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
108 4
|
29天前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
26 0
|
4月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
62 7
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
26 3
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
35 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
41 1