淺談java物件之間相互轉化的多種方式
第一種:使用org.apache.commons.beanutils.PropertyUtils.copyProperties()拷貝一個bean中的屬性到另一個bean中,第一個引數是目標bean,第二個引數是源bean。
特點:
1.它的效能問題相當差
2.PropertyUtils有自動型別轉換功能,而java.util.Date恰恰是其不支援的型別
3.PropertyUtils支援為null的場景;
public static void copyProperties(Object dest,Object orig) { try { PropertyUtils.copyProperties(dest,orig); } catch (IllegalAccessException | InvocationTargetException throw new IllegalArgumentException(e); | NoSuchMethodException e) { } }
第二種:使用BeanUtils.copyProperties()拷貝一個bean中的屬性到另一個bean中,第二個引數是源bean。
特點:
1.BeanUtils速度相對快一些
2.BeanUtils沒有自動轉換功能,遇到引數名相同,型別不同的引數不會進行賦值。
3.BeanUtils對部分屬性不支援null的情況,Ineger、Boolean、Long等不支援
public static void copyProperties(Object dest,Object orig) { try { BeanUtils.copyProperties(dest,orig); } catch (IllegalAccessException | InvocationTargetException e) { throw new IllegalArgumentException(e); } }
第三種:將java物件轉換為json,然後將JSON轉換成Java物件。注意屬性名要相同---採取com.fasterxml.jackson.databind.ObjectMapper的方法
特點:
1.屬性名一致就可以轉換
2.效率及異常還未驗證
private static final ObjectMapper MAPPER = new ObjectMapper(); String jsonStr = MAPPER.writeValueAsString(obj); RabbitMQDataDto detail = MAPPER.readValue(jsonStr,RabbitMQDataDto.class);
第四種:將java物件轉換為json,然後將JSON轉換成Java物件。注意屬性名要相同---採取com.alibaba.fastjson.JSON
特點:
1.需要拷貝的兩個物件裡面都包含有另一個物件,但是另一個物件裡面屬性相同但是物件名不同;
採用json來轉換隻要屬性名一致即可
InsurePersonInfoDto applicantInfo = insureRelevantPersonInfoDto.getApplicantInfo(); ThirdPartInsurePersonInfo thirdPartApplicantInfo = JSON.parseObject(JSON.toJSONString(applicantInfo),new TypeReference<ThirdPartInsurePersonInfo>() {});
補充知識:javabean實體類與實體類之間的快速轉換
一、Dozer是什麼?
dozer是一個能把實體和實體之間進行轉換的工具.只要建立好對映關係.就像是ORM的資料庫和實體對映一樣.
使用方法示例如下:
// article(PO) -> articleVO
ArticleVO articleVO = dozerMapper.map(article,ArticleVO.class);
這段示例程式碼。將從資料庫裡面查詢得到的PO物件article,轉換為VO物件articleVO,轉換過程將所有同名同類型的資料自動賦值給articleVO的成員變數,當然除了reader(因為PO裡面沒有reader陣列資料)。轉換需要寫屬性之間的對映麼?不! 預設是根據屬性名稱來匹配的.
如果沒有Dozer我們進行,物件之間的轉換賦值,我們會怎麼做?下面的這5行等於上面的一行。
articleVO.setId(article.getId()); articleVO.setAuthor(article.getAuthor()); articleVO.setTitle(article.getTitle()); articleVO.setContent(article.getContent()); articleVO.setCreateTime(article.getCreateTime());
二、使用Dozer進行實體類的轉換:
首先引入依賴
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.4.0</version> </dependency>
注入一個工具類DozerBeanMapper 到上下文中,
@Configuration public class DozerBeanMapperConfigure { @Bean public DozerBeanMapper mapper() { DozerBeanMapper mapper = new DozerBeanMapper(); return mapper; } }
注入然後開始使用啦
@Autowired
protected Mapper dozerMapper;
在實際應用中,我們不只需要PO轉VO,有時還需要List轉List.寫一個工具類,實現List轉List
public class DozerUtils { static DozerBeanMapper dozerBeanMapper = new DozerBeanMapper(); public static <T> List<T> mapList(Collection sourceList,Class<T> destinationClass){ List destinationList = Lists.newArrayList(); for (Iterator i$ = sourceList.iterator(); i$.hasNext();){ Object sourceObject = i$.next(); Object destinationObject = dozerBeanMapper.map(sourceObject,destinationClass); destinationList.add(destinationObject); } return destinationList; } }
以上這篇淺談java物件之間相互轉化的多種方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。