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