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 }

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

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

时间: 2024-12-25 12:23:25

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

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

Java的反射非常强大,传递class, 可以动态的生成该类.取得这个类的所有信息,包括里面的属性.方法以及构造函数等,甚至可以取得其父类或父接口里面的内容. obj.getClass().getDeclaredMethods();//取得obj类中自己定义的方法, 包括私有的方法. obj.getClass().getMethods();//取得obj类中自己定义的方法及继承过来的方法, 但私有方法得不到. 同样, 对field也是一样,obj.getClass().getDeclaredFi

java 反射和泛型

反射 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够"观察"并且修改自己的行为. 要注意术语"反射"和"内省"(type introspection)的关系.内省(或称"自省")机制仅指程序在运行时对自身信息(称为元数据)的检测:反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序

java 反射 子类泛型的class

很早之前写过利用泛型和反射机制抽象DAO ,对其中获取子类泛型的class一直不是很理解.关键的地方是HibernateBaseDao的构造方法中的 [java] view plaincopy Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); entityClass =  (Class)params[0]

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

Java反射第一课认识Class类

Class类 1.在面向对象的世界里,万事万物皆对象 (1)先来理解两个问题: (1)Java语音中,静态的成员,普通数据类型是不是对象? [普通的数据类型int a = 5 不是面向对象的,但是它有包装类弥补了] [java静态的东西不是面向对象的,静态的东西不是某个对象的他是属于类的] 所以在面向对象的世界里,万事万物皆对象 (2)类是谁的对象? 类是对象,类是java.lang.Class类的实例对象 Class类的实例对象是什么?---我们每一个对象所属的类就是Class类的实例对象(也

java反射获得泛型参数getGenericSuperclass():获取到父类泛型的类型

public class Person<T> { } import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Student extends Person<Student> { public static void main(String[] args) { Student st=new Student(); Class clazz=st.getClass();

java反射系列五之获取类的完整结构

代码示例 Person类 package reflect; @MyAnnotation(value = "guozi") public class Person extends Creature<String> implements Comparable,MyInterface{ public String name; private int age; public Person() { super(); // TODO Auto-generated constructor

Java 反射的用法 有关Class类的解释

package com.imooc.test; public class ClassDemo1 { public static void main(String[] args) { Foo fool = new Foo();//foo1就表示出来了 //Foo 这个类也是一个实例对象,Class类的实例对象,如何表示呢 //任何一个类都是Class的实例对象,这个实例对象有三种表示方式 //第一种表示方式---> 实际在告诉我们任何一个类都有一个隐含的静态成员变量class Class cl =

Java 反射 java.lang.NoSuchFieldException:

异常描述:java.lang.NoSuchFieldException: 处理方式:将属性修改为public 原文地址:https://www.cnblogs.com/twuxian/p/11620028.html