你还在用BeanUtils进行对象属性拷贝?( 三 )

  • 当源类和目标类的属性名称、类型都相同 , 拷贝没问题 。
  • 当源对象和目标对象的属性名称相同、类型不同,那么名称相同而类型不同的属性不会被拷贝 。注意 , 原始类型(int , short , char)和 他们的包装类型 , 在这里都被当成了不同类型 , 因此不会被拷贝 。
  • 源类或目标类的setter比getter少 , 拷贝没问题 , 此时setter多余 , 但是不会报错 。
  • 源类和目标类有相同的属性(两者的getter都存在) , 但是目标类的setter不存在 , 此时会抛出NullPointerException 。
  • 四、BeanUtils与BeanCopier速度对比
    废话不多说 , 我这里直接演示两种工具10000条数据拷贝的耗时对比
    4.1 BeanUtils
    • 测试代码
    private static void beanUtil() {List<UserDO> list = DataUtil.createDataList(10000);long start = System.currentTimeMillis();List<UserDTO> dtoList = new ArrayList<>();list.forEach(userDO -> {UserDTO userDTO = new UserDTO();BeanUtils.copyProperties(userDO,userDTO);dtoList.add(userDTO);});log.info("BeanUtils cotTime: {}ms", System.currentTimeMillis() - start);}
    • 结果(耗时:232ms)
    20:14:24.380 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopyComparedDemo - BeanUtils cotTime: 232ms4.2 BeanCopier
    • 测试代码
    private static void beanCopier() {// 工具类生成10w条数据List<UserDO> doList = DataUtil.createDataList(10000);long start = System.currentTimeMillis();List<UserDTO> dtoList = new ArrayList<>();doList.forEach(userDO -> {BeanCopier b = BeanCopier.create(UserDO.class, UserDTO.class, false);UserDTO userDTO = new UserDTO();b.copy(userDO, userDTO, null);dtoList.add(userDTO);});log.info("BeanCopier costTime: {}ms", System.currentTimeMillis() - start);}
    • 结果(耗时:116ms)
    20:15:24.380 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopyComparedDemo - BeanCopier costTime: 116ms4.3 缓存BeanCopier实例提升性能BeanCopier拷贝速度快 , 性能瓶颈出现在创建BeanCopier实例的过程中 。所以 , 把创建过的BeanCopier实例放到缓存中 , 下次可以直接获取 , 提升性能 。
    • 测试代码
    private static void beanCopierWithCache() {List<UserDO> userDOList = DataUtil.createDataList(10000);long start = System.currentTimeMillis();List<UserDTO> userDTOS = new ArrayList<>();userDOList.forEach(userDO -> {UserDTO userDTO = new UserDTO();copy(userDO, userDTO);userDTOS.add(userDTO);});log.info("BeanCopier 加缓存后 costTime: {}ms", System.currentTimeMillis() - start);}public static void copy(Object srcObj, Object destObj) {String key = genKey(srcObj.getClass(), destObj.getClass());BeanCopier copier = null;if (!BEAN_COPIERS.containsKey(key)) {copier = BeanCopier.create(srcObj.getClass(), destObj.getClass(), false);BEAN_COPIERS.put(key, copier);} else {copier = BEAN_COPIERS.get(key);}copier.copy(srcObj, destObj, null);}private static String genKey(Class<?> srcClazz, Class<?> destClazz) {return srcClazz.getName() + destClazz.getName();}
    • 结果(耗时:6ms)
    20:32:31.405 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopyComparedDemo - BeanCopier 加缓存后 costTime: 6ms五、总结及源码
    你还在用BeanUtils进行对象属性拷贝?

    文章插图
     
    来源:掘金 链接:https://juejin.im/post/5dc2b293e51d456e65283e61




    推荐阅读