一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - BeanUtils.copyProperties使用總結以及注意事項說明

BeanUtils.copyProperties使用總結以及注意事項說明

2021-12-10 13:33啊~~噙! Java教程

這篇文章主要介紹了BeanUtils.copyProperties使用總結以及注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

1.前言

開發過程中,講一個對象的屬性和值賦值到另一個對象上,大量使用了get、set方法,看著很臃腫,思考下肯定不只有我有這種想法,所以技術上肯定有方法能解決這個問題,所以查閱了一些資料發現了BeanUtils.copyProperties這個方法以下是這次所有的總結以及使用時的注意事項。

使用org.springframework.beans.BeanUtils.copyProperties方法進行對象之間屬性的賦值,避免通過get、set方法一個一個屬性的賦值。

2.一般使用

BeanUtils是這個包里比較常用的一個工具類,該方法定義如下:

?
1
2
3
public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
   throws java.lang.IllegalAccessException,
      java.lang.reflect.InvocationTargetException

如 果你有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts里的PO對象(持久對象)和對應的ActionForm,例如 Teacher和TeacherForm。我們一般會在Action里從ActionForm構造一個PO對象,傳統的方式是使用類似下面的語句對屬性逐 個賦值:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//1得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//2構造Teacher對象
Teacher teacher=new Teacher();
//3賦值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//4持久化Teacher對象到數據庫
HibernateDAO=;
HibernateDAO.save(teacher);

而使用BeanUtils后,代碼就大大改觀了,如下所示:

?
1
2
3
4
5
6
7
8
9
//1得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//2構造Teacher對象
Teacher teacher=new Teacher();
//3賦值
BeanUtils.copyProperties(teacher,teacherForm);
//4持久化Teacher對象到數據庫
HibernateDAO=;
HibernateDAO.save(teacher);

如 果Teacher和TeacherForm間存在名稱不相同的屬性,則BeanUtils不對這些屬性進行處理,需要程序員手動處理。

例如 Teacher包含modifyDate(該屬性記錄最后修改日期,不需要用戶在界面中輸入)屬性而TeacherForm無此屬性,那么在上面代碼的 copyProperties()后還要加上一句:

?
1
teacher.setModifyDate(new Date());

3.拷貝屬性時忽略空值

使用BeanUtils.copyProperties有一個問題就是當src對象的鍵值為Null時

就會把target對象的對應鍵值覆蓋成空了,這明顯不是我們想要的,以下這個方法可以解決

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 復制屬性,過濾掉不復制的屬性
 */
public static void copyBeanProperties(
    final Object source,//1,待復制的原始對象
    final Object target,//2,復制后的結果對象
    //3,獲取保存你不需要復制的屬性名
    final Collection<String> excludes = new ArrayList<String>();
    final PropertyDescriptor[] propertyDescriptors = BeanUtils.getPropertyDescriptors(source.getClass());
    for(final PropertyDescriptor propertyDescriptor : propertyDescriptors){
        String propName = propertyDescriptor.getName();
        if(!includes.contains(propName)){
            excludes.add(propName);
        }
    }
    //4,復制操作
    BeanUtils.copyProperties(source, target, excludes.toArray(new String[excludes.size()]));
}

使用案例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static String[] getNullPropertyNames (Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> emptyNames = new HashSet<String>();
        for(java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null) emptyNames.add(pd.getName());
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }
    public static void copyPropertiesIgnoreNull(Object src, Object target){
        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
    }

4.使用注意事項(1)

Property.copyProperties()和BeanUtils.copyProperties()

除BeanUtils外還有一個名為PropertyUtils的工具類,它也提供copyProperties()方法

  • 1.無論是org.springframework.beans或者org.apache.commons.beanutils,與get/set方式相比,都存在性能問題。
  • 2.效率由高到底:get/set 》PropertyUtils 》BeanUtils。
  • 3.PropertyUtils和BeanUtils兩個工具類都是對bean之間存在屬性名相同的屬性進行處理,無論是源bean或者是目標bean中多出來的屬性均不處理。
  • 4.具體來說:BeanUtils.copyProperties()可以在一定范圍內進行類型轉換,同時還要注意一些不能轉換時候,會將默認null值轉化成0;Property.copyProperties()則是嚴格的類型轉化,必須類型和屬性名完全一致才轉化。對于null的處理:PropertyUtils支持為null的場景;BeanUtils對部分屬性不支持null,具體如下:
    • a. java.util.Date類型不支持,但是它的自雷java.sql.Date是被支持的。java.util.Date直接copy會報異常;
    • b. Boolean,Integer,Long等不支持,會將null轉化為0;
    • c. String支持,轉化后依然為null。
  • 5.BeanUtils的高級功能org.apache.commons.beanutils.Converter接口可以自定義類型轉化,也可以對部分類型數據的null值進行特殊處理,如ConvertUtils.register(new DateConverter(null), java.util.Date.class);但是PropertyUtils沒有。

另外:值得注意的是,在測試過程中發現,commons-beanutils-1.8.0.jar版本中的BeanUtils類,支持Byte到Integer或int的轉化。說明實際使用過程中,我們還是要多看源碼,多做測試,并且注意版本號升級帶來的微小變化。

BeanUtils支持的轉換類型如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* java.lang.BigDecimal
* java.lang.BigInteger
* boolean and java.lang.Boolean
* byte and java.lang.Byte
* char and java.lang.Character
* java.lang.Class
* double and java.lang.Double
* float and java.lang.Float
* int and java.lang.Integer
* long and java.lang.Long
* short and java.lang.Short
* java.lang.String
* java.sql.Date
* java.sql.Time
* java.sql.Timestamp

這里要注意一點,java.util.Date是不被支持的,而它的子類java.sql.Date是被支持的。因此如果對象包含時間類型的屬性,且希望被轉換的時候,一定要使用java.sql.Date類型。否則在轉換時會提示argument mistype異常。

5.使用注意事項(2)

在Java中copyProperties() 這個方法出處有兩個地方,

BeanUtils是org.springframework.beans.BeanUtils

BeanUtils是org.apache.commons.beanutils.BeanUtils

下面具體說說他們的用法和區別。這個方法在不同的包下面,而這兩個類的copyProperties()方法里面傳遞的參數賦值是相反的。

例如:a,b為對象 BeanUtils.copyProperties(a, b);

?
1
2
3
4
5
6
7
8
BeanUtils是org.springframework.beans.BeanUtils
//a拷貝到b
//a1 源文件,b1 目標文件
public static void copyProperties(Object a1, Object b1)
        throws BeansException
    {
        copyProperties(a1, b1, null, (String[])null);
    }

BeanUtils是org.apache.commons.beanutils.BeanUtils

?
1
2
3
4
5
6
7
//b拷貝到a
//a2目標文件 ,b2 原始的,源文件
public static void copyProperties(Object a2, Object b2)
        throws IllegalAccessException, InvocationTargetException
    {
        BeanUtilsBean.getInstance().copyProperties(a2, b2);
    }

引用包出處不一樣,意思就不一樣,使用的時候一定要看清楚是哪個包下面的。

6.使用注意事項(3)

方法使用起來是不是即省事又舒服?but。。。get/set寫代碼省事是要付出代價的,那就是使用BeanUtils的運行成本也驚人!BeanUtils所花費的時間要超過取數 據、將其復制到對應的 value對象(通過手動調用get和set方法),以及通過串行化將其返回到遠程的客戶機的時間總和。所以要小心使用這種威力!有失必有得,反之亦然。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/huluwa10526/article/details/108767427

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 国产99久久九九精品免费 | ak福利影院 | 亚洲国产美女精品久久久久 | 能免费观看的韩剧 | 日韩精品一区二区三区老鸭窝 | 色啪久久婷婷综合激情 | 色亚洲视频 | 国产精品久线观看视频 | 久久国产精品永久免费网站 | 91精品91| 久久草福利自拍视频在线观看 | 996热精品视频在线观看 | 欧美综合另类 | 久久天堂成人影院 | chinese军人@gay | 国产欧美久久久精品影院 | 国产一级黄毛片 | ysl蜜桃色成人麻豆 youwu在线影院 | 国产亚洲福利精品一区二区 | 国产一区二区三区在线 | 微拍秒拍99福利精品小视频 | 日本美女视频韩国视频网站免费 | 青青草精品在线 | 国产大片线上免费观看 | 国产欧美视频一区二区三区 | 亚洲高清国产拍精品影院 | 无限资源在线观看高清 | 91制片厂制作果冻传媒八夷 | 精品成人一区二区 | 秋霞午夜伦午夜高清福利片 | 国产激情一区二区三区成人91 | 日本视频高清免费观看xxx | 91大片淫黄大片在线天堂 | 青春草在线观看精品免费视频 | ai换脸杨颖啪啪免费网站 | 日本中文字幕高清 | 亚洲视频国产精品 | 国产探花在线视频 | 欧美一区二区三区gg高清影视 | 调教麻麻成贱m | 欧美办公室silkstocking |