spring和apache commons-beanutils中分別存在一個(gè)BeanUtils,提供了對(duì)java bean的常用操作。
之前在寫(xiě)程序時(shí),用到了兩個(gè)不同類型但屬性基本相同的對(duì)象的拷貝,結(jié)果在拷貝java.util.Date類型的對(duì)象屬性時(shí),由于其值為null,而拋異常。
由于時(shí)間緊急,所以臨時(shí)改成了get/set方式,幸虧對(duì)象的屬性不算多。
后來(lái)一直耿耿于懷這個(gè)問(wèn)題,今天抽空看了一下spring和apache commons-beanutils包中BeanUtils.copyProperties的實(shí)現(xiàn)。
spring中實(shí)現(xiàn)的方式很簡(jiǎn)單,就是對(duì)兩個(gè)對(duì)象中相同名字的屬性進(jìn)行簡(jiǎn)單get/set,僅檢查屬性的可訪問(wèn)性。
而commons-beanutils則施加了很多的檢驗(yàn),包括類型的轉(zhuǎn)換,甚至于還會(huì)檢驗(yàn)對(duì)象所屬的類的可訪問(wèn)性。
而且,commons-beanutils中的裝換是不支持java.util.Date的。除了支持基本類型以及基本類型的數(shù)組之外,還支持java.sql.Date, java.sql.Time, java.sql.TimeStamp, java.io.File, javaio.URL這些類的對(duì)象,其余一概不支持。不過(guò)你可以自定義你的類的Converter。然后注冊(cè)進(jìn)去。
感覺(jué)commons-beanutils包中的這個(gè)BeanUtils類的copyProperties方法,太過(guò)復(fù)雜,約束太多,而且使用不便,雖然可擴(kuò)展性好了,但是易用性不高。
總結(jié):
關(guān)于bean復(fù)制,如果屬性較少,建議直接寫(xiě)個(gè)方法完成get/set即可。如果屬性較多,可以自己采用反射實(shí)現(xiàn)一個(gè)滿足自己需要的工具類,或者使用spring的那個(gè)beanutils類,不建議使用commons-beanutils包中的那個(gè)BeanUtils類,剛看了下,這個(gè)類對(duì)于內(nèi)部靜態(tài)類的對(duì)象復(fù)制也會(huì)出現(xiàn)問(wèn)題,檢驗(yàn)太復(fù)雜了,常會(huì)出現(xiàn)一些詭異的問(wèn)題。畢竟我們bean復(fù)制一般就是簡(jiǎn)單的屬性copy而已。
而且,由于這些BeanUtils類都是采用反射機(jī)制實(shí)現(xiàn)的,對(duì)程序的效率也會(huì)有影響。因此,慎用BeanUtils.copyProperties?。。?/p>
聯(lián)系客服