1. 程式人生 > 程式設計 >淺談java物件之間相互轉化的多種方式

淺談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物件之間相互轉化的多種方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。