中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

BeanUtils.copyProperties()怎么使用

發布時間:2022-06-15 11:49:36 來源:億速云 閱讀:221 作者:iii 欄目:開發技術

這篇文章主要介紹了BeanUtils.copyProperties()怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇BeanUtils.copyProperties()怎么使用文章都會有所收獲,下面我們一起來看看吧。

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

這兩個類在不同的包下面,而這兩個類的copyProperties()方法里面傳遞的參數賦值是相反的。

例如:

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

兩者最大的區別是:

BeanUtils.copyProperties會進行類型轉換,而PropertyUtils.copyProperties不會。

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

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

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

1.對于類型為Boolean/Short/Integer/Float/Double的屬性,它會轉換為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上有人解釋說是因為這幾個類型都有對應的基本類型,在進行類型轉換時,有可能遇到類似Integer -> int的轉換,此時顯然不能對int類型的屬性賦值為null,因此統一轉換為0。

如何讓它不要轉為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(); 
 
//如果沒有下面幾行,則在轉換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還會經常碰到這樣變態的需求:

  • 假設是從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); 
 } 
}

關于“BeanUtils.copyProperties()怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“BeanUtils.copyProperties()怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宿迁市| 文水县| 山东省| 德江县| 富平县| 屏东县| 韩城市| 隆安县| 三亚市| 连平县| 绥化市| 拉孜县| 洛阳市| 湾仔区| 桃江县| 区。| 保靖县| 阿拉尔市| 明光市| 湘潭县| 赫章县| 旬邑县| 漾濞| 和龙市| 德安县| 周宁县| 红安县| 民县| 永定县| 海宁市| 兴安盟| 武夷山市| 朝阳区| 淳化县| 淮阳县| 孝义市| 托克逊县| 东明县| 屯门区| 肥城市| 额敏县|