天天看點

PropertyUtils.copyProperties和BeanUtils.copyProperties使用差別

位于org.apache.commons.beanutils包裡面的這兩個參數拷貝方法可以複制一個對象中相同名字的參數值到另一個對象,能簡化很多代碼,但是這兩個copy方法使用起來有很大差別。

[java] 

view plain

 copy

/** 

     * 參數拷貝 

     *  

     * @param dest 目标 

     * @param orig 資料源 

     * @author  

     * */  

    public static void copyProperties(Object dest, Object orig) {  

        try {  

            PropertyUtils.copyProperties(dest, orig);  

        } catch (IllegalAccessException | InvocationTargetException  

                | NoSuchMethodException e) {  

            throw new IllegalArgumentException(e);  

        }  

    }  

     * 參數拷貝,沒有類型轉換功能 

    public static void copyPropertiesByBean(Object dest, Object orig) {  

            BeanUtils.copyProperties(dest, orig);  

        } catch (IllegalAccessException | InvocationTargetException e) {  

            e.printStackTrace();  

不讨論原理,隻說實際開發中BeanUtils要比PropertyUtils好用很多,剛開始我用的PropertyUtils來拷貝參數,遇到一個大坑。

當遇到dest中參數是java.util.Date類型,orig參數類型是java.lang.String類型時,使用PropertyUtils會報錯,查了一些資料,發現PropertyUtils有自動類型轉換功能,而java.util.Date恰恰是其不支援的類型;

也就是說,在自動轉換類型時,報錯了。

我也查了一些解決辦法,大概就是重寫PropertyUtils的copy方法,使其支援java.util.Date,不過我覺得日期轉換有多種格式需求,不能僅僅轉成一個yyyy-MM-dd格式,是以我認為這種方法複雜并且有缺陷。

而BeanUtils沒有自動轉換功能,遇到參數名相同,類型不同的參數不會進行指派。是以在使用完BeanUtils的copy方法後,手工再把類型不同的參數處理下就行了。

網上有說BeanUtils遇到java.util.Date類型也會報錯,實際開發環境jdk1.7,完全正常,沒有錯誤。

是以開發中,我推薦使用

BeanUtils.copyProperties  

繼續閱讀