运用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;
}
相关文章
|
6天前
|
存储 Java
Java中判断一个对象是否是空内容
在 Java 中,不同类型的对象其“空内容”的定义和判断方式各异。对于基本数据类型的包装类,空指对象引用为 null;字符串的空包括 null、长度为 0 或仅含空白字符,可通过 length() 和 trim() 判断;集合类通过 isEmpty() 方法检查是否无元素;数组的空则指引用为 null 或长度为 0。
|
25天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
24天前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
38 17
|
1月前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
32 15
|
2月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
98 20
|
2月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
148 1
|
2月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
74 2
|
2月前
|
Java API 开发者
深入理解Java中的异常处理机制
本文探讨了Java编程语言中异常处理的核心概念,包括异常类型、异常捕获与抛出、以及最佳实践。通过分析常见的异常场景和处理策略,旨在帮助开发者更好地理解和运用异常处理机制,提高代码的健壮性和可维护性。文章不仅涵盖了基本的try-catch结构,还深入讨论了自定义异常的创建与使用,以及finally块的重要性和应用。此外,还将介绍一些高级技巧,如多异常捕获和嵌套异常处理,为读者提供全面的技术指导。
115 0
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13

热门文章

最新文章