最近,鄙人在項目開發(fā)中需要用到對象復(fù)制之類的功能,所以很自然就想到copyProperties這個方法确镊。
先來簡單介紹一下:BeanUtils提供對Java反射和自省API的包裝愚臀。其主要目的是利用反射機(jī)制對JavaBean的屬性進(jìn)行處理。如果你有兩個甚至需要很多個 具有很多相同屬性的JavaBean辩越,那創(chuàng)建時候不是要不斷重復(fù)賦值嘁扼,而我們使用 BeanUtils.copyProperties() 方法以后,代碼量大大的減少黔攒,而且整體程序看著也簡潔明朗趁啸。
其中簡單的方法包含很多坑:
坑位1:
兩個不同的包(springframework , apache)中有一個相同名字的類强缘,相同的方法,方法的作用相同不傅,參數(shù)個數(shù)相同旅掂。
就是參數(shù)位置不同 - -!
package org.springframework.beans;中的
BeanUtils.copyProperties(A,B);
是A中的值賦給B
package org.apache.commons.beanutils;
BeanUtils.copyProperties(A,B);
是B中的值賦給A
坑位2:
場景:需要對某個集合中的所有元素拷貝到另一個集合中访娶,想著BeanUtils.copyProperties()可以深拷貝對象商虐,誤以為也可以拷貝集合,于是乎寫下了如下代碼
List?ruleList = Lists.newArrayList();
?BeanUtils.copyProperties(partList, ruleList?);
以上的操作結(jié)果不會報錯震肮,但是?ruleList?集合仍是一個空集合
BeanUtils.copyProperties只對bean屬性進(jìn)行復(fù)制称龙,這里的復(fù)制屬于淺復(fù)制。且不能復(fù)制集合和數(shù)組戳晌。BeanUtils.copyProperties利用反射鲫尊,直接將對象的引用set進(jìn)去,并不是深拷貝沦偎。
而且有一點:對于spring的beanUtils復(fù)制疫向,如果對象的屬性是繼承并且重定義了屬性,反射會copy不過去豪嚎。
坑位3:
由于這些BeanUtils類都是采用反射機(jī)制實現(xiàn)的搔驼,對程序的效率也會有影響。因此侈询,慎用BeanUtils.copyPropertiesI嗾恰!扔字!
除BeanUtils外還有一個名為PropertyUtils的工具類囊嘉,它也提供copyProperties()方法,作用與BeanUtils的同名方法十分相似革为,主要的區(qū)別在于后者提供類型轉(zhuǎn)換功能扭粱,即發(fā)現(xiàn)兩個JavaBean的同名屬性為不同類型時,在支持的數(shù)據(jù)類型范圍內(nèi)進(jìn)行轉(zhuǎn)換震檩,而前者不支持這個功能琢蛤,但是速度會更快一些。
汗抛虏,我還是自己set吧博其。。迂猴。