• 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
  • 相关阅读:
    [leetCode]剑指 Offer 43. 1~n整数中1出现的次数
    [leetCode]剑指 Offer 42. 连续子数组的最大和
    HDU
    HDU
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3842157.html
Copyright © 2020-2023  润新知