首页 > 其他分享 >类属性转换 拷贝 赋值

类属性转换 拷贝 赋值

时间:2024-02-13 16:45:02浏览次数:21  
标签:转换 worker 泛型 赋值 拷贝 属性 WorkerVO

参考链接  https://www.cnblogs.com/CodeBlogMan/p/18005657

 

三、类属性转换

在实际 Java 开发中,关于 VO、Entity、DTO 等对象属性之间的赋值是我们经常遇见的,最简单使用 @Data 去逐个 .set() 或者 @Builder 链式 .build(),其实都是很靠谱的办法,而且可以控制颗粒度。但属性一多起来的话,比如二十个以上,那么代码就会显得很长。所以有没有办法一行代码就搞定类属性转换呢?

首先不推荐使用 BeanUtils.copyProperties() 作类属性的拷贝,以下是几个常见的坑:

  1. 同一字段分别使用包装类型和基本类型,会出现转换异常,不会灵活识别转换
  2. null 值覆盖导致数据异常,即源属性有值为 null,但是目标属性有正常值,拷贝后会被 null 覆盖
  3. 内部类属性无法正常拷贝,即使类型和字段名均相同也无法拷贝成功,这个真的很坑

推荐泛型 + JSON组合的方式来实现类属性的转换,具体步骤如下:

  • 定义一个父类 CommonBean,让项目里所有 VO、Entity、DTO 等类都继承该类,类里面就只定义一个公共的泛型方法即可:

    public class CommonBean implements Serializable {
        /**
         * @apiNote 全局类型转换方法:入参和返参均支持泛型
         * @param target
         * @return 目标类型
         * @param <T>
         */
        public <T> T copyProperties(Class<T> target) {
            //本质上就是进行了 Object -> json字符串 -> 到指定类型的转换
            return JSON.parseObject(JSON.toJSONString(this), target);
        }
    }
    
  • 在需要转换的地方,直接调用上面定义的方法即可完成转换:

        @Test
        public void testCopyProperties(){
            //Worker 和 WorkerVO 都需要 extends 上述的 CommonBean
            Worker worker = new Worker();
            worker.setName("Alex");
            worker.setStatus(NumberUtils.INTEGER_ONE);
            //直接使用,得到需要的目标 VO 对象
            WorkerVO workerVO = worker.copyProperties(WorkerVO.class);
            log.info("转换结果:{}",workerVO);
        }

标签:转换,worker,泛型,赋值,拷贝,属性,WorkerVO
From: https://www.cnblogs.com/JavaYuYin/p/18014646

相关文章

  • 网页中嵌入MediaPlayer时,各种属性与方法设置
    播放:MediaPlayer.Play()暂停:MediaPlayer.Pause()定位:MediaPlayer.SetCurrentEntry(lWhichEntry)MediaPlayer.Next()MediaPlayer.Previous()循环:MediaPlayer.PlayCount=00:theclipplaysrepeatedly1:once停止:MediaPlayer.Stop()===========================......
  • 3种策略巧妙化解PHP Trait成员属性冲突
    说明PHP语言本身可以用insteadof和as关键字解决多个trait同名成员方法冲突的问题,但是貌似没有直接解决同名成员属性冲突的方案。虽然属性名冲突极少发生,但是不代表不会发生。如果是自定义trait可以复制旧trait文件到新trait,改新文件的成员属性名,引用新trait。直接更改原trai......
  • [BOM]获取url参数并赋值给cookie
    不安全,挺傻的,可以偷懒。 <script>functioninit_params(){varurl=location.search;//获取url中"?"符后的字串vartheRequest=newObject();if(url.indexOf("?")!=-1){varstr=......
  • [python3]: python --【class】类变量(类属性)
    [python3]: python --【class】类变量(类属性)    一、说明: 1、类变量:类变量,定义在【类内】且【函数外】。1classobject:23#class_variable4icount=0567def__init__(self):8#usingclass_vari......
  • js 双对象对比拷贝数据
    应用场景:1、两个深层次对象2、第一个对象为模板对象,第二个对象为返回的实际数据对象(简称实例对象)3、如果一个属性在实例对象内,就拿取实例对象的这个属性;如果没有,就从模板对象里面拿取。如果某个属性是数组对象,那么实例对象的这个属性内每一个数组对象都要与模板对......
  • js 字符集属性
    HTML5增加了几个与文档字符集有关的新属性。其中,characterSet属性表示文档实际使用的字符集,也可以用来指定新字符集。这个属性的默认值是"UTF-16",但可以通过元素或响应头,以及新增的characterSeet属性来修改。下面是一个例子:document.characterSet="UTF-8";自定义数据属性HTM......
  • Java 中的属性类Properties 以及TreeSet和TreeMap
    属性类Propertiesimportjava.util.Properties;/**目前只需要掌握Properties属性类对象的相关方法即可*Properties是一个Map集合,继承Hashtable,Properties的key和value都是String类型*Properties被称为属性类对象*Properties是线程安全的**/publicclassProperties......
  • Omit 用于创建一个新的类型,该类型包含了原始类型`T`的所有属性,但排除了指定的键`K`
    在TypeScript中,Omit<T,K>是一个内置的实用类型(从TypeScript3.5版本开始提供),用于创建一个新的类型,该类型包含了原始类型T的所有属性,但排除了指定的键K。其定义如下:typeOmit<T,Kextendskeyofany>=Pick<T,Exclude<keyofT,K>>;这个类型的工作原理是首先找出T的所有键(......
  • 下载、安装Git并拷贝GitHub项目到本地的流程
      本文介绍分布式开源版本控制系统Git的下载、安装,并基于Git实现克隆GitHub中项目代码的方法。  Git是一款开源软件,因此我们直接在Git的官方下载地址下载最新版本的Git即可。其中,在下图所示的位置选择适合我们操作系统的Git版本。  随后,选择下图红色方框内的内容,下载最新......
  • vue2 bpmn添加属性栏
    安装"bpmn-js-properties-panel":"^1.6.1"引入样式库import{ BpmnPropertiesPanelModule, BpmnPropertiesProviderModule,}from"bpmn-js-properties-panel";import"bpmn-js-properties-panel/dist/assets/properties-panel.css"......