inushome 发表于 2015-10-14 09:17:23

BeanUtils.copyProperties()的用法

  BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。
  下面通过代码来理解BeanUtils
  首先创建两个类
  Person.java
view plaincopy
[*]package com.org;
[*]
[*]import java.util.Date;
[*]
[*]public class Person {
[*]    private String name;
[*]    private String sex;
[*]    private int age;
[*]    private Date birthday;
[*]
[*]    public String getName() {
[*]      return name;
[*]    }
[*]
[*]    public void setName(String name) {
[*]      this.name = name;
[*]    }
[*]
[*]    public String getSex() {
[*]      return sex;
[*]    }
[*]
[*]    public void setSex(String sex) {
[*]      this.sex = sex;
[*]    }
[*]
[*]    public int getAge() {
[*]      return age;
[*]    }
[*]
[*]    public void setAge(int age) {
[*]      this.age = age;
[*]    }
[*]
[*]    public Date getBirthday() {
[*]      return birthday;
[*]    }
[*]
[*]    public void setBirthday(Date birthday) {
[*]      this.birthday = birthday;
[*]    }
[*]
[*]
[*]}
view plaincopy
[*]package com.org;
[*]
[*]import java.util.Date;
[*]
[*]public class Person {
[*]    private String name;
[*]    private String sex;
[*]    private int age;
[*]    private Date birthday;
[*]
[*]    public String getName() {
[*]      return name;
[*]    }
[*]
[*]    public void setName(String name) {
[*]      this.name = name;
[*]    }
[*]
[*]    public String getSex() {
[*]      return sex;
[*]    }
[*]
[*]    public void setSex(String sex) {
[*]      this.sex = sex;
[*]    }
[*]
[*]    public int getAge() {
[*]      return age;
[*]    }
[*]
[*]    public void setAge(int age) {
[*]      this.age = age;
[*]    }
[*]
[*]    public Date getBirthday() {
[*]      return birthday;
[*]    }
[*]
[*]    public void setBirthday(Date birthday) {
[*]      this.birthday = birthday;
[*]    }
[*]
[*]
[*]}

Student.java view plaincopy
[*]package com.org;
[*]
[*]import java.util.Date;
[*]
[*]public class Student {
[*]    private String name;
[*]    private int age;
[*]    private String address;
[*]    private Date birthday;
[*]
[*]    public String getName() {
[*]      return name;
[*]    }
[*]    public void setName(String name) {
[*]      this.name = name;
[*]    }
[*]    public int getAge() {
[*]      return age;
[*]    }
[*]    public void setAge(int age) {
[*]      this.age = age;
[*]    }
[*]    public String getAddress() {
[*]      return address;
[*]    }
[*]    public void setAddress(String address) {
[*]      this.address = address;
[*]    }
[*]    public Date getBirthday() {
[*]      return birthday;
[*]    }
[*]    public void setBirthday(Date birthday) {
[*]      this.birthday = birthday;
[*]    }
[*]
[*]
[*]}
view plaincopy
[*]package com.org;
[*]
[*]import java.util.Date;
[*]
[*]public class Student {
[*]    private String name;
[*]    private int age;
[*]    private String address;
[*]    private Date birthday;
[*]
[*]    public String getName() {
[*]      return name;
[*]    }
[*]    public void setName(String name) {
[*]      this.name = name;
[*]    }
[*]    public int getAge() {
[*]      return age;
[*]    }
[*]    public void setAge(int age) {
[*]      this.age = age;
[*]    }
[*]    public String getAddress() {
[*]      return address;
[*]    }
[*]    public void setAddress(String address) {
[*]      this.address = address;
[*]    }
[*]    public Date getBirthday() {
[*]      return birthday;
[*]    }
[*]    public void setBirthday(Date birthday) {
[*]      this.birthday = birthday;
[*]    }
[*]
[*]
[*]}

测试类BeanUtilTest.java view plaincopy
[*]package com.org;
[*]
[*]import java.lang.reflect.InvocationTargetException;
[*]import java.util.Date;
[*]
[*]//import com.sun.org.apache.commons.beanutils.BeanUtils;
[*]
[*]import org.apache.commons.beanutils.BeanUtils;
[*]
[*]public class BeanUtilTest {
[*]    public static void main(String[] args) {
[*]      Person per = new Person();
[*]      Student stu = new Student();
[*]
[*]      per.setName("zhangsan");
[*]      per.setSex("男");
[*]      per.setAge(20);
[*]      per.setBirthday(new Date());
[*]
[*]      stu.setName("wuangwu");
[*]      stu.setAddress("北京市");
[*]      try {
[*]            BeanUtils.copyProperties(stu, per);
[*]
[*]      } catch (IllegalAccessException e) {
[*]            // TODO Auto-generated catch block
[*]            e.printStackTrace();
[*]      } catch (InvocationTargetException e) {
[*]            // TODO Auto-generated catch block
[*]            e.printStackTrace();
[*]      }
[*]      System.out.println(stu.getName());
[*]      System.out.println(stu.getAge());
[*]      System.out.println(stu.getAddress());
[*]      System.out.println(stu.getBirthday());
[*]
[*]    }
[*]}
view plaincopy
[*]package com.org;
[*]
[*]import java.lang.reflect.InvocationTargetException;
[*]import java.util.Date;
[*]
[*]//import com.sun.org.apache.commons.beanutils.BeanUtils;
[*]
[*]import org.apache.commons.beanutils.BeanUtils;
[*]
[*]public class BeanUtilTest {
[*]    public static void main(String[] args) {
[*]      Person per = new Person();
[*]      Student stu = new Student();
[*]
[*]      per.setName("zhangsan");
[*]      per.setSex("男");
[*]      per.setAge(20);
[*]      per.setBirthday(new Date());
[*]
[*]      stu.setName("wuangwu");
[*]      stu.setAddress("北京市");
[*]      try {
[*]            BeanUtils.copyProperties(stu, per);
[*]
[*]      } catch (IllegalAccessException e) {
[*]            // TODO Auto-generated catch block
[*]            e.printStackTrace();
[*]      } catch (InvocationTargetException e) {
[*]            // TODO Auto-generated catch block
[*]            e.printStackTrace();
[*]      }
[*]      System.out.println(stu.getName());
[*]      System.out.println(stu.getAge());
[*]      System.out.println(stu.getAddress());
[*]      System.out.println(stu.getBirthday());
[*]
[*]    }
[*]}

程序输出结果为: view plaincopy
[*]zhangsan
[*]20
[*]北京市
[*]Fri Nov 25 13:03:29 CST 2011
view plaincopy
[*]zhangsan
[*]20
[*]北京市
[*]Fri Nov 25 13:03:29 CST 2011

可见Student自己设置的值都被Person给覆盖了   再做下面两个测试
  把Person中的setName和setAge 改为setnamesetage程序输出结果为
view plaincopy
[*]zhangsan
[*]20
[*]北京市
[*]Fri Nov 25 13:08:34 CST 2011
view plaincopy
[*]zhangsan
[*]20
[*]北京市
[*]Fri Nov 25 13:08:34 CST 2011

结果没有改变  而如果改为setNAme, setAGe结果为:
view plaincopy
[*]wuangwu
[*]0
[*]北京市
[*]Fri Nov 25 13:10:25 CST 2011
view plaincopy
[*]wuangwu
[*]0
[*]北京市
[*]Fri Nov 25 13:10:25 CST 2011

我们发现结果改变了内容没有被覆盖
  注: 当我们加载BeanUtils类时 可能会报如下错误
view plaincopy
[*]Exception in thread "main" java.lang.ExceptionInInitializerError
[*]    at com.org.BeanUtilTest.main(BeanUtilTest.java:101)
[*]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))
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
[*]    at com.sun.org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
[*]    at com.sun.org.apache.commons.beanutils.BeanUtils.<clinit>(BeanUtils.java:111)
[*]    ... 1 more
[*]Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
[*]    ... 5 more
[*]Caused by: java.lang.NullPointerException
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)
[*]    ... 6 more
view plaincopy
[*]Exception in thread &quot;main&quot; java.lang.ExceptionInInitializerError
[*]    at com.org.BeanUtilTest.main(BeanUtilTest.java:101)
[*]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))
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
[*]    at com.sun.org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
[*]    at com.sun.org.apache.commons.beanutils.BeanUtils.<clinit>(BeanUtils.java:111)
[*]    ... 1 more
[*]Caused by: com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
[*]    ... 5 more
[*]Caused by: java.lang.NullPointerException
[*]    at com.sun.org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)
[*]    ... 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 测试类写在一起的话会产生问题
  类似与这样的结构
view plaincopy
[*]class Person{
[*]    .....
[*]}
[*]class Student{
[*]    .....
[*]}
[*]
[*]public class BeanUtilTest {
[*]    public static void main(String[] args) {
[*]      ......
[*]    }
[*]}
页: [1]
查看完整版本: BeanUtils.copyProperties()的用法