浅谈java对象之间相互转化的多种方式

 更新时间:2020年08月21日 09:57:09   作者:天蓝色的程序员  
这篇文章主要介绍了浅谈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,第二个参数是源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对象之间相互转化的多种方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java不借助第三变量实现两数交换的示例

    Java不借助第三变量实现两数交换的示例

    本文主要介绍了Java不借助第三变量实现两数交换的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Spring中的AOP动态代理源码详解

    Spring中的AOP动态代理源码详解

    这篇文章主要介绍了Spring中的AOP动态代理源码详解,AOP即面向切面编程也称面向方面编程,它是面向对象编程OOP的一种补充,目前已成为一种比较成熟的编程方式,本文就其源码进行解析,需要的朋友可以参考下
    2023-09-09
  • SpringBoot整合RabbitMQ实现流量消峰

    SpringBoot整合RabbitMQ实现流量消峰

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用,消息中间件在互联网公司的使用中越来越多,本文给大家介绍了SpringBoot整合RabbitMQ实现流量消峰,需要的朋友可以参考下
    2024-12-12
  • Java中的byte & 0xff到底有什么作用?

    Java中的byte & 0xff到底有什么作用?

    这篇文章主要介绍了Java中的byte & 0xff到底有什么作用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java pdf文件书签承前缩放验证的设置方法

    Java pdf文件书签承前缩放验证的设置方法

    很多朋友不知道是什么是书签承前缩放,简单说就是可以任意改变当前pdf文档缩放比例,点击书签后不影响其缩放比率,本文给大家介绍下Java pdf文件书签承前缩放验证的设置方法,感兴趣的朋友一起看看吧
    2022-02-02
  • Mybatis 在 insert 插入操作后返回主键 id的操作方法

    Mybatis 在 insert 插入操作后返回主键 id的操作方法

    这篇文章主要介绍了Mybatis 在 insert 插入操作后返回主键 id的操作方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Java AQS(AbstractQueuedSynchronizer)源码解析

    Java AQS(AbstractQueuedSynchronizer)源码解析

    AbstractQueuedSynchronizer被称为队列同步器,简称为大家熟知的AQS,这个类可以称作concurrent包的基础。本文将通过剖析源码来看看AQS是如何工作的,感兴趣的可以了解一下
    2023-02-02
  • Java实现AWT四大事件的详细过程

    Java实现AWT四大事件的详细过程

    AWT的事件处理是一种委派式事件处理方式:普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件
    2022-04-04
  • Java解决同时出库入库订单号自动获取问题解决

    Java解决同时出库入库订单号自动获取问题解决

    在Java中,处理多线程环境下的订单号生成问题可以采用多种策略,如使用AtomicLong保证线程安全,通过定义订单号生成器并利用线程模拟出库和入库操作,每个线程从订单号生成器中获取唯一订单号,感兴趣的朋友一起看看吧
    2024-09-09
  • 详解关于SpringBoot的外部化配置使用记录

    详解关于SpringBoot的外部化配置使用记录

    这篇文章主要介绍了详解关于SpringBoot的外部化配置使用记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论