欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于兩個BeanUtils.copyProperties()的用法及區(qū)別

 更新時間:2022年06月15日 09:54:53   作者:大鵬小站  
這篇文章主要介紹了關(guān)于兩個BeanUtils.copyProperties()的用法及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

兩個BeanUtils.copyProperties()用法及區(qū)別

這兩個類在不同的包下面,而這兩個類的copyProperties()方法里面?zhèn)鬟f的參數(shù)賦值是相反的。

例如:

a,b為對象

BeanUtils.copyProperties(a, b);

public static void copyProperties(Object source, Object target) throws BeansException {//source 源文件,target 目標文件
? ? ? ? copyProperties(source, target, (Class)null, (String[])null);
? ? }

BeanUtils是org.apache.commons.beanutils.BeanUtils,b拷貝到a

?public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {//destination,目標文件,original原始的,源文件
? ? ? ? BeanUtilsBean.getInstance().copyProperties(dest, orig);
? ? }

這兩個不要搞混了! 

使用Beanutils.copyProperties()遇到的問題

BeanUtils.copyProperties VS PropertyUtils.copyProperties

兩者最大的區(qū)別是:

BeanUtils.copyProperties會進行類型轉(zhuǎn)換,而PropertyUtils.copyProperties不會。

既然進行了類型轉(zhuǎn)換,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。

因此,PropertyUtils.copyProperties應用的范圍稍為窄一點,它只對名字和類型都一樣的屬性進行copy,如果名字一樣但類型不一樣,它會報錯

使用BeanUtils有幾個要注意的地方:

1.對于類型為Boolean/Short/Integer/Float/Double的屬性,它會轉(zhuǎn)換為0: 

public class User {  
 private Integer intVal;   
 private Double doubleVal;   
 private Short shortVal;   
 private Long longVal;   
 private Float floatVal;   
 private Byte byteVal;   
 private Boolean booleanVal; 
} 
 
User src = new User(); 
User dest = new User(); 
BeanUtils.copyProperties(dest, src); 
System.out.println(src); 
System.out.println(dest); 
 
//輸出  
User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null] 
User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false] 

在stackoverflow上有人解釋說是因為這幾個類型都有對應的基本類型,在進行類型轉(zhuǎn)換時,有可能遇到類似Integer -> int的轉(zhuǎn)換,此時顯然不能對int類型的屬性賦值為null,因此統(tǒng)一轉(zhuǎn)換為0。

如何讓它不要轉(zhuǎn)為0呢?可以這樣:

import org.apache.commons.beanutils.converters.IntegerConverter; ?
IntegerConverter converter = new IntegerConverter(null); //默認為null,而不是0?
BeanUtilsBean beanUtilsBean = new BeanUtilsBean();?
beanUtilsBean.getConvertUtils().register(converter, Integer.class);?

2.對于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time這幾個類,如果值為null,則在copy時會拋異常,需要使用對應的Conveter: 

public class User2 {  
 private java.util.Date javaUtilDateVal;   
 private java.sql.Date javaSqlDateVal;   
 private java.sql.Timestamp javaSqlTimeStampVal;   
 private BigDecimal bigDecimalVal;  
 private java.sql.Time javaSqlTime;  
} 
 
User2 src = new User2(); 
User2 dest = new User2();  
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 
 
//如果沒有下面幾行,則在轉(zhuǎn)換null時會拋異常,例如:org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal' 
//在org.apache.commons.beanutils.converters這個包下面有很多的Converter,可以按需要使用 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.BigDecimalConverter(null), BigDecimal.class); 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.DateConverter(null), java.util.Date.class); 
 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class); 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class); 
beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimeConverter(null), java.sql.Time.class); 
 
beanUtilsBean.copyProperties(dest, src); 
System.out.println(src); 
System.out.println(dest); 

使用BeanUtils還會經(jīng)常碰到這樣變態(tài)的需求:

  • 假設(shè)是從A復制到B:
  • 需求1:如果B中某字段有值(不為null),則該字段不復制;也就是B中該字段沒值時,才進行復制,適合于對B進行補充值的情況。
  • 需求2:如果A中某字段沒值(為null),則該字段不復制,也就是不要把null復制到B當中。
  • 對于需求1,可以這樣:
import org.apache.commons.beanutils.BeanUtilsBean; 
import org.apache.commons.beanutils.PropertyUtils;  
public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{ 
 
 @Override 
 public void copyProperty(Object bean, String name, Object value) 
   throws IllegalAccessException, InvocationTargetException { 
  try { 
   Object destValue = PropertyUtils.getSimpleProperty(bean, name); 
   if (destValue == null) { 
    super.copyProperty(bean, name, value); 
   } 
  } catch (NoSuchMethodException e) { 
   throw new RuntimeException(e); 
  } 
 }  
} 

對于需求2,可以這樣:

import org.apache.commons.beanutils.BeanUtilsBean;  
public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean { 
 
 @Override 
 public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { 
  if (value == null) { 
   return; 
  } 
  super.copyProperty(bean, name, value); 
 } 
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Boot?Security認證之Redis緩存用戶信息詳解

    Spring?Boot?Security認證之Redis緩存用戶信息詳解

    本文介紹了如何使用Spring Boot Security進行認證,并通過Redis緩存用戶信息以提高系統(tǒng)性能,通過配置RedisUserDetailsManager,我們成功地將用戶信息存儲到了Redis中,并在Spring Security中進行了集成,需要的朋友可以參考下
    2024-01-01
  • Springboot hibernate envers使用過程詳解

    Springboot hibernate envers使用過程詳解

    這篇文章主要介紹了Springboot hibernate envers使用過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • jstorm源碼解析之bolt異常處理方法

    jstorm源碼解析之bolt異常處理方法

    下面小編就為大家?guī)硪黄猨storm源碼解析之bolt異常處理方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java中4種經(jīng)典限流算法講解

    Java中4種經(jīng)典限流算法講解

    本文主要介紹了Java中4種經(jīng)典限流算法講解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 詳解eclipse項目中.classpath文件的使用

    詳解eclipse項目中.classpath文件的使用

    這篇文章主要介紹了詳解eclipse項目中.classpath文件的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • SpringBoot響應出現(xiàn)中文亂碼的解決方法

    SpringBoot響應出現(xiàn)中文亂碼的解決方法

    這篇文章主要介紹了SpringBoot響應出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作有一定的參考價值,需要的朋友們下面隨著小編來一起來學習吧
    2024-02-02
  • 詳解Java對象轉(zhuǎn)換神器MapStruct庫的使用

    詳解Java對象轉(zhuǎn)換神器MapStruct庫的使用

    在我們?nèi)粘i_發(fā)的程序中,為了各層之間解耦,一般會定義不同的對象用來在不同層之間傳遞數(shù)據(jù)。當在不同層之間傳輸數(shù)據(jù)時,不可避免地經(jīng)常需要將這些對象進行相互轉(zhuǎn)換。今天給大家介紹一個對象轉(zhuǎn)換工具MapStruct,代碼簡潔安全、性能高,強烈推薦
    2022-09-09
  • java+mysql實現(xiàn)圖書館管理系統(tǒng)實戰(zhàn)

    java+mysql實現(xiàn)圖書館管理系統(tǒng)實戰(zhàn)

    這篇文章主要為大家詳細介紹了java+mysql實現(xiàn)圖書館管理系統(tǒng)實戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • java面向?qū)ο笾藱C猜拳小游戲

    java面向?qū)ο笾藱C猜拳小游戲

    這篇文章主要為大家詳細介紹了java面向?qū)ο笾藱C猜拳小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Java8中的Stream流式操作教程之王者歸來

    Java8中的Stream流式操作教程之王者歸來

    這篇文章主要給大家介紹了關(guān)于Java8中Stream流式操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09

最新評論