• BeanUtils的copyproPerties方法的用法


    转自:Hassan Blog的博客

    一、简介: 
      BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

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

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

    如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是实体类对象(持久对象)和对应的数据传输对象,例如 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.save(teacher);
    而使用BeanUtils后,代码就大大改观了,如下所示: 
    //得到TeacherForm   
    TeacherForm teacherForm=(TeacherForm)form;   
      
    //构造Teacher对象   
    Teacher teacher=new Teacher();   
      
    //赋值   
    BeanUtils.copyProperties(teacher,teacherForm);   
      
    //持久化Teacher对象到数据库   
    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异常。

    三、优缺点: 
      Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我 将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:
    BeanUtils.copyProperties(aValue, aLocal)  

    上面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设 local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用 了! 
      现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!

  • 相关阅读:
    Spring Boot 使用 Dom4j XStream 操作 Xml
    Spring Boot 使用 JAX-WS 调用 WebService 服务
    Spring Boot 使用 CXF 调用 WebService 服务
    Spring Boot 开发 WebService 服务
    Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE
    Spring Boot Ftp Client 客户端示例支持断点续传
    Spring Boot 发送邮件
    Spring Boot 定时任务 Quartz 使用教程
    Spring Boot 缓存应用 Memcached 入门教程
    ThreadLocal,Java中特殊的线程绑定机制
  • 原文地址:https://www.cnblogs.com/luxianyu-s/p/9719668.html
Copyright © 2020-2023  润新知