运用Java 反射机制实现对象克隆及类属性的克隆

简介: 根据业务需求调用核心业务系统接口,其中接口要求传输JSON数据格式,将Java对象数据直接转换为JSON数据格式;同时该Java对象随时都有可能根据业务需求变动被增加新的数据字段,而调用接口时并不需要额外的字段,如果再用该Java对象数据转换的JSON数据,就会出现调用接口参数不正确的情况,

根据业务需求调用核心业务系统接口,其中接口要求传输JSON数据格式,将Java对象数据直接转换为JSON数据格式;同时该Java对象随时都有可能根据业务需求变动被增加新的数据字段,而调用接口时并不需要额外的字段,如果再用该Java对象数据转换的JSON数据,就会出现调用接口参数不正确的情况,

如:接口系统要求的JSON数据格式:{"body":{"data":{"bankAccount":"","bankCode":"","orderNo":""},"sign":""}};
而根据 AddPremiumBean 实体类转换成的JSON数据格式:{"body":{"data":{"accountName":"","bankAccount":"","bankCode":"","orderNo":""},"sign":""}},显然多一个字段,不符合要求。

解决方法:

为了避免对AddPremiumBean修改造成其它影响,如在AddPremiumBean实体类中增加新字段。为了能够复用 AddPremiumBean 对象数据,则专门定义一个对应接口的实体类 BodyAddPremiumBean,以实现对AddPremiumBean对象数据的复制,从而达到对数据的获取。
public class AddPremiumBean implements Cloneable{
       private String orderNo;
       private String accountName;
       private String bankCode;
       private String bankAccount;
       // 分别对所有属性实现get/set方法 
       public Object clone() throws CloneNotSupportedException{
              AddPremiumBean addPremiumParam = (AddPremiumBean) super.clone();
              return addPremiumParam;
       }
}

public class BodyAddPremiumBean implements Cloneable{
       // 分别对所有属性实现get/set方法
       private String orderNo;
       private String bankCode;
       private String bankAccount;
       public AddPremiumBean addPremiumParam;
       public BodyAddPremiumBean(){

       }
       // 通过构造函数传递对象
       public BodyAddPremiumBean(AddPremiumBean addPremiumParam){
              super();
              this.addPremiumParam = addPremiumParam;
       }
       // 深度克隆:addPremiumParam非基本类型变量,而是引用类型变量
       public Object clone() throws CloneNotSupportedException{
              BodyAddPremiumBean bodyAddPremium = (BodyAddPremiumBean) super.clone();
              bodyAddPremium.addPremiumParam = (AddPremiumBean) addPremiumParam.clone();
              return bodyAddPremium;
       }
}

上述代码中并没有对当前对象属性赋值,而仅对对象引用进行了克隆;需要再对 BodyAddPremiumBean 类clone()方法 进行改造,运用反射机制进行类属性克隆,代码如下:

public Object clone() throws CloneNotSupportedException{
    BodyAddPremiumBean bodyAddPremium = null;
    try {
        bodyAddPremium = (BodyAddPremiumBean) super.clone();
        bodyAddPremium.addPremiumParam = (AddPremiumBean) addPremiumParam.clone();
        Class<?> sclasss = this.getClass();
        Class<?> fclasss = bodyAddPremium.addPremiumParam.getClass();
        Field[] sfields = sclasss.getDeclaredFields();
        Field[] ffields = fclasss.getDeclaredFields();

        for(Field sfield : sfields){
            for(Field ffield : ffields){
                ffield.setAccessible(true);
                if(sfield.getName().equals(ffield.getName())){
                    sfield.set(bodyAddPremium, ffield.get(bodyAddPremium.addPremiumParam));
                }
            }
        }
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return bodyAddPremium;
}
相关文章
|
4天前
|
安全 Java API
16 个最常用的 Java 实用程序类
【8月更文挑战第16天】
14 1
16 个最常用的 Java 实用程序类
|
5天前
|
缓存 前端开发 Java
【前端学java】复习巩固-Java中的对象比较(15)
【8月更文挑战第11天】Java中的对象比较
15 1
【前端学java】复习巩固-Java中的对象比较(15)
|
2天前
|
SQL Java Apache
实时计算 Flink版操作报错合集之使用parquet时,怎么解决报错:无法访问到java.uti.Arrays$ArrayList类的私有字段
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4天前
|
Java API 开发者
|
3天前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
5天前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
6天前
|
设计模式 人工智能 Java
Java 如何使用单例类
Java 如何使用单例类
5 1
|
2天前
|
存储 设计模式 Java
在 Java 中创建多个对象
【8月更文挑战第17天】
6 0
|
5天前
|
Java 数据库连接 API
Java 的 SPI 机制
Java 的 SPI 机制
10 0
|
5天前
|
Java Spring 容器
Java SpringBoot 中,动态执行 bean 对象中的方法
Java SpringBoot 中,动态执行 bean 对象中的方法
14 0