• 利用BeanUtils在对象间复制属性


    commons-beanutils是jakarta commons子 项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对 JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度(什么,你的薪水按代码行数计算?那千万别让老板看到此帖哦)

    BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

    public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
      throws java.lang.IllegalAccessException,
             java.lang.reflect.InvocationTargetException

    如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐 个赋值:

    //得到TeacherForm
    TeacherForm teacherForm=(TeacherForm)form;
    //构造Teacher对象
    Teacher teacher=new Teacher();
    //赋值
    teacher.setName(teacherForm.getName());
    teacher.setAge(teacherForm.getAge());
    teacher.setGender(teacherForm.getGender());
    teacher.setMajor(teacherForm.getMajor());
    teacher.setDepartment(teacherForm.getDepartment());
    
    //持久化Teacher对象到数据库
    HibernateDAO=;
    HibernateDAO.save(teacher);

    而使用BeanUtils后,代码就大大改观了,如下所示:

    //得到TeacherForm
    TeacherForm teacherForm=(TeacherForm)form;
    //构造Teacher对象
    Teacher teacher=new Teacher();
    //赋值
    BeanUtils.copyProperties(teacher,teacherForm);
    //持久化Teacher对象到数据库
    HibernateDAO=;
    HibernateDAO.save(teacher);

    如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

    teacher.setModifyDate(new Date());

    怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用 与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范 围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:

    • java.lang.BigDecimal
    • java.lang.BigInteger
    • boolean and java.lang.Boolean
    • byte and java.lang.Byte
    • char and java.lang.Character
    • java.lang.Class
    • double and java.lang.Double
    • float and java.lang.Float
    • int and java.lang.Integer
    • long and java.lang.Long
    • short and java.lang.Short
    • java.lang.String
    • java.sql.Date
    • java.sql.Time
    • java.sql.Timestamp

    这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

  • 相关阅读:
    我们都可以把它放 Sidecar 容器中,这样微服务具备了 Super power,一种超能力
    DP 状态 DP 转移方程 动态规划解题思路
    完全二叉树 原因 完全二叉树最后一层节点靠左的原因
    延时任务最佳实践方案总结
    b+ 树 只存储 索引
    埋点质量保障体系建设
    linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <
    卡特兰数
    python 使用函数名的字符串调用函数(4种方法)_black-heart的专栏-CSDN博客 https://blog.csdn.net/mrqingyu/article/details/84403924
    12 | 服务注册与发现如何满足服务治理
  • 原文地址:https://www.cnblogs.com/HD/p/3639219.html
Copyright © 2020-2023  润新知