JAVA对象拷贝 — Interge自动转Long?效率比拼

前言

今天开发中遇到一个小问题。
因为前期沟通不到位。有同学把一个后台接口(用于获取ES中的商品数据)的id相关字段,都设置成了Interge。而我们公司ID的要求是Long。

这导致数据后期维护十分不方便。还容易出错,举个例子
因为泛型擦除所以并不会报错且iidMap真实返回类型是Map<Interge, ItemTO>。导致调用iidMap.containsKey时用Long型是永远取不到的。
在这里插入图片描述
因为是Dubbo服务已经暴露出去。。。不太好收口。后期会废弃使用新的接口。临时的方案,准备用代理层,进行对象的拷贝。

那么我们问题就变成如下2个问题

1:如何选择JAVA Bean的Copy方式
2:Interge要能自动转化为Long

先把备的拷贝思路罗列出来

 1. 手工编码
 2. 动态代理
 3. Spring反射
 4. 序列化  

有了思路,那我开搞,顺道学习和复习总结一下JAVA对象的拷贝。
其中序列化方式,在这里其实是可行的。首先后台的量级不大,操作也方便,也能进行Interge和Long的转换。相对的序列化有明显的性能瓶颈,在大量操作时性能下降的特别快。

抱着好奇,我们一并探究并验证下手工编码,动态代理,Spring反射具体性能如何?能否转换Interge和Long?

有了相关的思路,网上也找了一下文章,自己动手实现一下
具体代码基本结构参考三石雨的文章大家可以看看

先看运行结果

在这里插入图片描述
5中方式的效率如图所示。
效率来说:
手写 > 动态代理 > 反射

 1. ManualCopy: 手动编写,效率最高,能类型转换,代码量多
 2. Cglib:动态代理,效率高,不能进行类型转换
 3. Apache Bean Utils , 反射,比较耗时,能进行类型转换
 4. Spring Bean Utils :反射中等耗时,不能进行类型住哪换
 5. Apache Property Utils : 反射 类型不同,直接报错。

代码结构

来看看代码结构。

  • Bean 源数据和目标数据(其中id类型不同)
  • Process类(策略模式)
  • 各类CopyMethod
  • PerformanceTest 单测类
    在这里插入图片描述
依赖
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
Bean

SourceBean :id为Integer

package com.lctest.demo.lctrain.JavaBeanCopyTest.TO;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

import java.util.Map;

/**
 * SourceBean :id为Integer
 *
 * @author xiwen.chen
 * @since 2020-05-06
 */
@Setter
@Getter
public class SourceBean {
   

    private Integer iid;

    @JsonProperty("gmt_create")
    private Integer gmtCreate;

    private String name;

    @JsonProperty("actor_map")
    private Map<String, String> actorMap;
}

DestBean:对应Source的id 变为 Long型

package com.lctest.demo.lctrain.JavaBeanCopyTest.TO;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

import java.util.Map;

/**
 * DestBean:对应Source的id  变为 Long型
 *
 * @author xiwen.chen
 * @since 2020-05-06
 */
@Setter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值