1. 程式人生 > >BeanUtils.copyProperties(A,B)使用注意事項

BeanUtils.copyProperties(A,B)使用注意事項

***最近專案中用到BeanUtils.copyProperties(),然後踩了一些坑,也在網上查看了很多同行的測試和總結,現在將自己的測試、整理的注意事項分享如下,希望大家一起學習進步。

***注意:本篇還有很多沒有研究到的地方,如果各位需要使用BeanUtils的功能,還需要根據自身情況多加測試,驗證。任何第三方的工具未經調研、測試和驗證,都是有風險的,你我共勉!

BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set程式碼堆積,增加了程式碼長度和閱讀程式碼的難度。

【開宗明義】

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。

4.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的轉化。說明實際使用過程中,我們還是要多看原始碼,多做測試,並且注意版本號升級帶來的微小變化。

【詳細說明】

1、package org.springframework.beans;中的     BeanUtils.copyProperties(A,B);     是A中的值付給B  
FinCpDocDO  finCpDoc = finCpDocService.selectByDocNo(orderNo);
FinCpDocDto finCpDto = new FinCpDocDto();if (finCpDoc == null){
   throw new ServiceException("查無該訂單" + "orderNo:" + orderNo);
}try{
   BeanUtils.copyProperties(finCpDoc, finCpDto);
2、package org.apache.commons.beanutils;(常用)      BeanUtils.copyProperties(A,B);      是B中的值付給A
for(OboFeeDO feeDO : oboFeeList){
    if(feeDO.getPayTime()!=null){
        ErpOboFeeDto feeDto = new ErpOboFeeDto();
BeanUtils.copyProperties(feeDto, feeDO);
oboFeList.add(feeDto);
}
}

具體賦值情況,可以參考兩個包下copyProperties原始碼檢視。

3.org.apache.commons.beanutils下的BeanUtils支援的型別轉化列表:

* 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  

相關推薦

BeanUtils.copyProperties(A,B)使用注意事項

***最近專案中用到BeanUtils.copyProperties(),然後踩了一些坑,也在網上查看了很多同行的測試和總結,現在將自己的測試、整理的注意事項分享如下,希望大家一起學習進步。***注意:本篇還有很多沒有研究到的地方,如果各位需要使用BeanUtils的功能,還

BeanUtils.copyProperties(A,B)欄位複製

          BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set程式碼堆積,增加了程式碼長

vue + webpack <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="52792427377f313e3b12607c62">[email protected]a>打包注意事項總結(

以下是用[email protected]構建的後臺管理系統中總結出來的打包注意事項 1,執行已有釋出環境打包命令 npm  run  build 以後,的dist資料夾放到本地部署的tomcat中執行,找不到檔案       原因是,官方配置檔案 config

HDU-A+B Problem 的Java題解 用Java語言做ACM的注意事項

  A+B問題應該可以說是做起來最開心的ACM題目了,杭電上從1089~1096全都是A+B問題,雖然都是水題,但是在此處也貼出來算了,八道題隨便貼幾道,內容沒什麼好說的,就加加加~~~就行啦。  

領口要求真的高/三數之和 給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 ab,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答

import itertools from functools import reduce l=[] l1=[-1,0,1,2,-1,-4] m=list(itertools.combinations(l1,3)) #為了拿出所有的三元組 數學組合

P1865 A % B Problem

code 輸入輸出 說明 tin else 描述 sca ++ return 題目背景 題目名稱是吸引你點進來的 實際上該題還是很水的 題目描述 區間質數個數 輸入輸出格式 輸入格式: 一行兩個整數 詢問次數n,範圍m 接下來n行,每行兩個整數 l,r

NOI-CCF 1123. A-B (Standard IO)

for style void class using bound pen dset getch 題目描述 給定N個數Ai,以及一個正整數C,問有多少對i,j,滿足Ai-Aj=C。 輸入 第一行輸入兩個空格隔開的整數N和C第2至N+1行每行包含一個

【數論線性篩】洛谷P1865 A%B problem

continue 個數 區間 str 輸出 數據 兩個 裸題 n) 題目背景 題目名稱是吸引你點進來的 實際上該題還是很水的 題目描述 區間質數個數 輸入輸出格式 輸入格式: 一行兩個整數 詢問次數n,範圍m 接下來n行,每行兩個整數 l,r 表示區間 輸出格式:

P1303 A*B Problem

cst clu ont tdi cnblogs ring b- max can 題目描述 求兩數的積。 輸入輸出格式 輸入格式: 兩個數 輸出格式: 積 輸入輸出樣例 輸入樣例#1: 1 2

N A B C D

通過 社會 網頁 困難 事情 nbsp bcd 的人 需要 滴滴跑腿NABCD分析 N需求 現在人懶,宅,需要幫他跑腿的,還有就是有事情忙,沒時間做。 A做法 現在很多人沒工作,而且也不會工作,幫人跑腿總該會吧,可以召集大量員工通過設計的app給人跑腿。 B好處 為社會增加

Codeforces Round #253 (Div. 1)-A,B

clas efi 狀態 ng- char oid out urn esp A題: 由題意可知,最多翻10次就能夠(事實上8次就夠了)。那麽我們就用狀態壓縮表示狀態。 對於某種狀態,假設某一位為0,那麽代表這一位不翻,否則代表這一位翻。 對於某一種翻的狀態: 假設牌中有G

HDOJ1002-A + B Problem II(高精加)

change test case logs names div lar struct () har Problem Description I have a very simple problem for you. Given two integers A and B,

老男孩教育每日一題-2017年5月22日-命令風暴:變量a=’a/b/c’如何截取得到c

linux三劍客 每日一題 取字符串 1.題目老男孩教育每日一題-2017年5月22日-命令風暴:變量a=’a/b/c’如何截取得到c2.參考答案系統環境[[email protected]/* */ ~]# uname -r2.6.32-504.el6.x86_64 [[email&

HDU - 1576 A/B(擴展歐幾裏得算法)

cout using ret d+ col turn 理論 mes 表示 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 題意:要求(A/B)%9973,但由於A很大,我們只給出n(n=A%9973)(我們給定的A必

Codeforces Round #416 (Div. 2) A+B

src separate not sum redo swe tput output depend A. Vladik and Courtesy 2 seconds 256 megabytes At regular competition Vl

HDU 1412 {A} + {B}

title sin unique using ace 每一個 padding back stl Problem Description 給你兩個集合。要求{A} + {B}. 註:同一個集合中不會有兩個同樣的元素. Input 每組輸入數據分為三行,第一

hdu 1867 A + B for you again

roc stdio.h 相同 tween them substr bsp sdf des A + B for you again Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (

A+B和C (15)

tro des sta 用例 rfi file tps col fix 時間限制 1000 ms 內存限制 32768 KB 代碼長度限制 100 KB 判斷程序 Standard (來自 小小) 題目描述 給定區間[-2的31次方, 2的31次方]內的3個整數

hdu1230 火星A+B

++ content acm pan 進制 加法 tdi align accep 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1230 題目類型: 模擬 題意概括: 第i位數的進制為第i個素數,求兩個這樣的數之和

杭電 2096 小明A+B

miss script ava spa ace 個數 例如 mem ani 小明A+B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm