BeanUtils与PropertyUtils的copyProperties方法的差别
1. copyProperties
? ? ? ? org.apache.commons.beanutils包中有兩個(gè)工具類,BeanUtils與PropertyUtils,這兩個(gè)工具類中各自有一個(gè)copyProperties(Object? dest, Object orig)方法,這兩個(gè)方法可以將兩個(gè)對(duì)象當(dāng)中相同的屬性的值由源對(duì)象賦值至目標(biāo)對(duì)象中。用到這個(gè)類的場(chǎng)景一般是由前臺(tái)傳到后臺(tái)的一個(gè)包裝類,將這個(gè)包裝類的值copy到一個(gè)實(shí)體對(duì)象中,由這個(gè)實(shí)體對(duì)象寫入數(shù)據(jù)庫(kù)表,可以省去多行g(shù)et與set方法。
?
2. BeanUtils與PropertyUtils的copyProperties方法的差別
? ? ? ?這兩個(gè)工具類當(dāng)中的copyProperties方法的方法名、參數(shù),都一樣,所使用到的場(chǎng)景也類似,它們之間的差別在于源對(duì)象中int、值為null的時(shí)候。以下用代碼說(shuō)明,有一個(gè)User類,及一個(gè)繼承自該類的UserVO,這要做的事,是將User當(dāng)中的屬性copy到UserVO當(dāng)中。
?
3. 測(cè)試代碼
3.1 實(shí)體類
? ? ? ? 下面有兩個(gè)實(shí)體類,其中一個(gè)實(shí)體類繼承自另一個(gè)實(shí)體類,測(cè)試代碼要做的事情就是將父類屬性的值賦到子類當(dāng)中(由于篇幅原因,省去get、set與toString方法)。
import java.util.Date;public class User {private Long id;private String name;private Integer sex;private Double age;private Date birthDay; } public class UserVO extends User{private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;} }3.2?測(cè)試方法
? ? ? ? 對(duì)于非null值的屬性,兩個(gè)工具類中的方法得到的結(jié)果是一樣的,那么直接用null值來(lái)進(jìn)行測(cè)試,測(cè)試方法如下:
import java.lang.reflect.InvocationTargetException;import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils;public class Test01 {public static void main(String[] args) {// 原對(duì)象User sourceUser = new User();sourceUser.setId(null);sourceUser.setName(null);sourceUser.setAge(null);sourceUser.setSex(null);sourceUser.setBirthDay(null);// 目標(biāo)對(duì)象UserVO destUser = new UserVO();// 測(cè)試BeanUtiltestBeanUtil(destUser, sourceUser);// 測(cè)試PropertyUtiltestPropertyUtil(destUser, sourceUser);}private static void testBeanUtil(User destUser, User sourceUser) {try {BeanUtils.copyProperties(destUser, sourceUser);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}System.out.println("BeanUtils result:" + destUser);}private static void testPropertyUtil(User destUser, User sourceUser) {try {PropertyUtils.copyProperties(destUser, sourceUser);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}System.out.println("PropertyUtils result:" + destUser);} }3.3?輸出結(jié)果
BeanUtils result:User [id=0, name=null, sex=0, age=0.0, birthDay=null, address=null] PropertyUtils result:User [id=null, name=null, sex=null, age=null, birthDay=null, address=null]? ? ? ? 由打印的結(jié)果可以看到,Long類型、Integer類型、Double類型的值如果為空,調(diào)用BeanUtils的copyProperties方法地到的結(jié)果會(huì)將這些類型的值賦為0或者0.0,而使用PropertyUtils的copyProperties方法源對(duì)象與目標(biāo)對(duì)象的值是一樣的。
?
4. 結(jié)論
? ? ? ? 使用org.apache.commons.beanutils.BeanUtils的copyProperties方法得到的結(jié)果會(huì)將為null的Integer、Long、Double類型的屬性賦值為0或者0.0,但對(duì)于String、Date等類則不會(huì)有這種結(jié)果(null依然為null),而使用org.apache.commons.beanutils.BeanUtils的copyProperties方法得到的結(jié)果不會(huì)給null值賦初始值(null依然為null)。所以在實(shí)際的開發(fā)中碰到類似的業(yè)務(wù)場(chǎng)景需要正確選用合適的工具類。
總結(jié)
以上是生活随笔為你收集整理的BeanUtils与PropertyUtils的copyProperties方法的差别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: It技能图谱(13张)
- 下一篇: c语言编程 碰撞的小球,小球碰撞游戏程序