BeanUtils.copyProperties()的用法

本文介绍如何使用BeanUtils简化JavaBean属性的批量操作,通过创建Person和Student类并设置属性,演示了如何利用BeanUtils的copyProperties方法实现属性之间的复制,以及在不同设置情况下的行为差异,并探讨了引入BeanUtils类时可能出现的错误及其解决方法。
摘要由CSDN通过智能技术生成

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

下面通过代码来理解BeanUtils

首先创建两个类

Person.java

  1. package com.org;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Person {  
  6.     private String name;  
  7.     private String sex;  
  8.     private int age;  
  9.     private Date birthday;  
  10.   
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public String getSex() {  
  20.         return sex;  
  21.     }  
  22.   
  23.     public void setSex(String sex) {  
  24.         this.sex = sex;  
  25.     }  
  26.   
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.   
  31.     public void setAge(int age) {  
  32.         this.age = age;  
  33.     }  
  34.   
  35.     public Date getBirthday() {  
  36.         return birthday;  
  37.     }  
  38.   
  39.     public void setBirthday(Date birthday) {  
  40.         this.birthday = birthday;  
  41.     }  
  42.       
  43.   
  44. }  
  1. package com.org;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Person {  
  6.     private String name;  
  7.     private String sex;  
  8.     private int age;  
  9.     private Date birthday;  
  10.   
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public String getSex() {  
  20.         return sex;  
  21.     }  
  22.   
  23.     public void setSex(String sex) {  
  24.         this.sex = sex;  
  25.     }  
  26.   
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.   
  31.     public void setAge(int age) {  
  32.         this.age = age;  
  33.     }  
  34.   
  35.     public Date getBirthday() {  
  36.         return birthday;  
  37.     }  
  38.   
  39.     public void setBirthday(Date birthday) {  
  40.         this.birthday = birthday;  
  41.     }  
  42.       
  43.   
  44. }  

Student.java
  1. package com.org;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Student {  
  6.     private String name;  
  7.     private int age;  
  8.     private String address;  
  9.     private Date birthday;  
  10.       
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.     public void setAge(int age) {  
  21.         this.age = age;  
  22.     }  
  23.     public String getAddress() {  
  24.         return address;  
  25.     }  
  26.     public void setAddress(String address) {  
  27.         this.address = address;  
  28.     }  
  29.     public Date getBirthday() {  
  30.         return birthday;  
  31.     }  
  32.     public void setBirthday(Date birthday) {  
  33.         this.birthday = birthday;  
  34.     }  
  35.       
  36.       
  37. }  
  1. package com.org;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Student {  
  6.     private String name;  
  7.     private int age;  
  8.     private String address;  
  9.     private Date birthday;  
  10.       
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.     public void setAge(int age) {  
  21.         this.age = age;  
  22.     }  
  23.     public String getAddress() {  
  24.         return address;  
  25.     }  
  26.     public void setAddress(String address) {  
  27.         this.address = address;  
  28.     }  
  29.     public Date getBirthday() {  
  30.         return birthday;  
  31.     }  
  32.     public void setBirthday(Date birthday) {  
  33.         this.birthday = birthday;  
  34.     }  
  35.       
  36.       
  37. }  

测试类  BeanUtilTest.java
  1. package com.org;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.util.Date;  
  5.   
  6. //import com.sun.org.apache.commons.beanutils.BeanUtils;  
  7.   
  8. import org.apache.commons.beanutils.BeanUtils;  
  9.   
  10. public class BeanUtilTest {  
  11.     public static void main(String[] args) {  
  12.         Person per = new Person();  
  13.         Student stu = new Student();  
  14.           
  15.         per.setName("zhangsan");  
  16.         per.setSex("男");  
  17.         per.setAge(20);  
  18.         per.setBirthday(new Date());  
  19.           
  20.         stu.setName("wuangwu");  
  21.         stu.setAddress("北京市");  
  22.         try {  
  23.             BeanUtils.copyProperties(stu, per);  
  24.               
  25.         } catch (IllegalAccessException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } catch (InvocationTargetException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.         System.out.println(stu.getName());  
  33.         System.out.println(stu.getAge());  
  34.         System.out.println(stu.getAddress());  
  35.         System.out.println(stu.getBirthday());  
  36.           
  37.     }  
  38. }  
  1. package com.org;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.util.Date;  
  5.   
  6. //import com.sun.org.apache.commons.beanutils.BeanUtils;  
  7.   
  8. import org.apache.commons.beanutils.BeanUtils;  
  9.   
  10. public class BeanUtilTest {  
  11.     public static void main(String[] args) {  
  12.         Person per = new Person();  
  13.         Student stu = new Student();  
  14.           
  15.         per.setName("zhangsan");  
  16.         per.setSex("男");  
  17.         per.setAge(20);  
  18.         per.setBirthday(new Date());  
  19.           
  20.         stu.setName("wuangwu");  
  21.         stu.setAddress("北京市");  
  22.         try {  
  23.             BeanUtils.copyProperties(stu, per);  
  24.               
  25.         } catch (IllegalAccessException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } catch (InvocationTargetException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.         System.out.println(stu.getName());  
  33.         System.out.println(stu.getAge());  
  34.         System.out.println(stu.getAddress());  
  35.         System.out.println(stu.getBirthday());  
  36.           
  37.     }  
  38. }  

程序输出结果为:
[plain] view plain copy
  1. zhangsan  
  2. 20  
  3. 北京市  
  4. Fri Nov 25 13:03:29 CST 2011  
[plain] view plain copy
  1. zhangsan  
  2. 20  
  3. 北京市  
  4. Fri Nov 25 13:03:29 CST 2011  

可见Student自己设置的值都被Person给覆盖了 

再做下面两个测试

把Person中的setName和setAge 改为setname  setage程序输出结果为

[plain] view plain copy
  1. zhangsan  
  2. 20  
  3. 北京市  
  4. Fri Nov 25 13:08:34 CST 2011  
[plain] view plain copy
  1. zhangsan  
  2. 20  
  3. 北京市  
  4. Fri Nov 25 13:08:34 CST 2011  

结果没有改变

而如果改为setNAme, setAGe结果为:

[plain] view plain copy
  1. wuangwu  
  2. 0  
  3. 北京市  
  4. Fri Nov 25 13:10:25 CST 2011  
[plain] view plain copy
  1. wuangwu  
  2. 0  
  3. 北京市  
  4. Fri Nov 25 13:10:25 CST 2011  

我们发现结果改变了  内容没有被覆盖

注: 当我们加载BeanUtils类时 可能会报如下错误

  1. Exception in thread "main" java.lang.ExceptionInInitializerError  
  2.     at com.org.BeanUtilTest.main(BeanUtilTest.java:101)  
  3. Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) (Caused by com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException))  
  4.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)  
  5.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)  
  6.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)  
  7.     at com.sun.org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)  
  8.     at com.sun.org.apache.commons.beanutils.BeanUtils.<clinit>(BeanUtils.java:111)  
  9.     ... 1 more  
  10. Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)  
  11.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)  
  12.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)  
  13.     ... 5 more  
  14. Caused by: java.lang.NullPointerException  
  15.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)  
  16.     ... 6 more  
  1. Exception in thread "main" java.lang.ExceptionInInitializerError  
  2.     at com.org.BeanUtilTest.main(BeanUtilTest.java:101)  
  3. Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) (Caused by com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException))  
  4.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)  
  5.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)  
  6.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)  
  7.     at com.sun.org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)  
  8.     at com.sun.org.apache.commons.beanutils.BeanUtils.<clinit>(BeanUtils.java:111)  
  9.     ... 1 more  
  10. Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)  
  11.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)  
  12.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)  
  13.     ... 5 more  
  14. Caused by: java.lang.NullPointerException  
  15.     at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)  
  16.     ... 6 more  

产生错误的原因是引入的包不对,应引入 import org.apache.commons.beanutils.BeanUtils;

而不应是import com.sun.org.apache.commons.beanutils.BeanUtils;

另外所需jar包为:

commons-beanutils-1.8.3.jar

commons-logging-1.1.1.jar

还有一个很邪门的问题 实在令我不解

就是如果把Person,Student 测试类写在一起的话  会产生问题

类似与这样的结构

  1. class Person{  
  2.     .....  
  3. }  
  4. class Student{  
  5.     .....  
  6. }  
  7.   
  8. public class BeanUtilTest {  
  9.     public static void main(String[] args) {  
  10.         ......  
  11.     }  
  12. }  
主题推荐
exception microsoft 测试 thread logging
猜你在找
【精品课程】竟有如此全面的软考资料?“碉堡”了!
【精品课程】HTML 5全掌控
【精品课程】Cocos2d-x实战-手把手教你上线项目-迷失航线
【精品课程】Swift语言进阶
【精品课程】深入浅出MySQL入门必备
src="http://blog.csdn.net/common/ad.html?t=4&containerId=ad_cen&frmId=ad_frm_0" style="border-width: 0px; overflow: hidden; width: 746px; height: 97px;" scrolling="no" id="ad_frm_0" frameborder="0">
查看评论

  暂无评论

发表评论
  • 用 户 名:
  • lansky54
  • 评论内容:
  • 插入代码
    •   
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    src="http://blog.csdn.net/common/ad.html?t=5&containerId=ad_bot&frmId=ad_frm_1" style="border-width: 0px; overflow: hidden; width: 746px; height: 0px;" scrolling="no" id="ad_frm_1" frameborder="0">
    • 个人资料
      • 访问:60534次
      • 积分:1228
      • 等级:
      • 排名:第16917名
      • 原创:68篇
      • 转载:25篇
      • 译文:0篇
      • 评论:5条
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值