首先spring和apache中都有 BeanUtils.copyProperties() 這個工具類和方法,apache的更強大,但是spring性能更高,看項目需求取捨
http://blog.csdn.net/isnotsuitable/article/details/7531187
BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set代碼堆積,增加了代碼長度和閱讀代碼的難度。
下面通過代碼來理解BeanUtils
首先創建兩個類
Person.java
- 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;
- }
- }
- 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
- 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;
- }
- }
- 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
- 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());
- }
- }
- 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());
- }
- }
程序輸出結果爲:
- zhangsan
- 20
- 北京市
- Fri Nov 25 13:03:29 CST 2011
- zhangsan
- 20
- 北京市
- Fri Nov 25 13:03:29 CST 2011
可見Student自己設置的值都被Person給覆蓋了
再做下面兩個測試
把Person中的setName和setAge 改爲setname setage程序輸出結果爲
- zhangsan
- 20
- 北京市
- Fri Nov 25 13:08:34 CST 2011
- zhangsan
- 20
- 北京市
- Fri Nov 25 13:08:34 CST 2011
結果沒有改變
而如果改爲setNAme, setAGe結果爲:
- wuangwu
- 0
- 北京市
- Fri Nov 25 13:10:25 CST 2011
- wuangwu
- 0
- 北京市
- Fri Nov 25 13:10:25 CST 2011
我們發現結果改變了 內容沒有被覆蓋
注: 當我們加載BeanUtils類時 可能會報如下錯誤
- 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
- 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
產生錯誤的原因是引入的包不對,應引入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 測試類寫在一起的話 會產生問題
類似與這樣的結構
- class Person{
- .....
- }
- class Student{
- .....
- }
- public class BeanUtilTest {
- public static void main(String[] args) {
- ......
- }
- }