Java的各种实体复制方法及实际操作

发布于:2024-10-24 编辑:匿名 来源:网络

Java中的实体复制通常是指将一个对象的属性值复制到另一个对象的过程。物理复制可以是浅复制(Shallow Copy)或深复制(Deep Copy)。

浅拷贝只复制对象的引用,而不复制被引用的对象本身;深层复制复制对象以及该对象内引用的所有对象。实现实体复制的方法有很多,包括直接赋值、使用克隆方法、通过序列化/反序列化以及使用反射或第三方库。

下面详细介绍这些实现原理: 直接赋值最直接的复制方法是通过手动赋值,即显式调用源对象的各个属性的 getter 方法,并通过目标对象的 setter 方法设置获得的值目的。这种方法简单直观,但当属性较多或对象结构复杂时,代码量较大,且容易出错。

使用克隆方法 Java 提供了 Cloneable 接口。通过实现这个接口并重写Object类的clone()方法,类可以实现复制自身的能力。

根据clone()方法的实现,可以实现浅复制或深复制。但这种方法需要对每个需要深度复制的属性进行手工处理,容易出错且不灵活。

通过序列化/反序列化,将对象序列化为字节流,然后从字节流中反序列化出新的对象,从而实现完整的深拷贝。这要求该对象及其中引用的所有对象都实现 Serialized 接口。

这种方法虽然可以一次性完成深拷贝,但是性能比较低,并且需要处理序列化过程中可能抛出的异常。使用反射通过Java反射机制,可以在运行时动态获取一个对象的类信息和属性信息,然后动态读取属性值并将其设置给另一个对象。

这种方式不需要对象实现特定的接口或方法,更加灵活。但反射操作性能较低,需要处理安全、访问控制等问题。

第三方库 很多第三方库,如 Apache Commons BeanUtils、Spring BeanUtils、ModelMapper、MapStruct 等,都提供了更高级、更灵活的复制功能。这些库通常在内部使用反射机制,但向外界提供简单的API,解决性能、类型转换和深度复制等常见问题。

使用这些库可以大大减少手动编码的工作量,提高开发效率。总的来说,实体复制的实现原理涉及直接属性赋值、对象克隆、序列化/反序列化、反射等技术。

选择哪种方法取决于您的特定需求、对象的复杂性、性能要求以及引入外部依赖项的意愿。在实践中,为了平衡开发效率和性能,开发者通常倾向于使用成熟的第三方库来实现物理副本。

BeanUtils.copyProperties方法是Apache Commons BeanUtils库提供的一种工具方法,可以将一个Java Bean对象的属性复制到另一个Java Bean对象。这种方法应用广泛,特别是在需要对象之间进行数据转换的场景,例如从数据库实体转换为传输对象(DTO)。

优点 简单:使用 BeanUtils.copyProperties 方法极大地简化了您的代码,并避免了为每个属性手动编写 get 和 set 调用的繁琐过程。灵活性:不要求源对象和目标对象具有相同的类。

只要它们具有名称相同且类型兼容的属性,就可以进行属性复制。反射机制:该方法是通过Java反射机制实现的,因此可以动态地处理对象,增加编码灵活性。

扩展性:Apache Commons BeanUtils库提供了很多工具方法,不仅限于属性复制,还包括属性的动态查询和设置、嵌套属性的操作等。 缺点 性能问题:由于BeanUtils.copyProperties方法内部使用了反射机制,其性能比直接调用 get 和 set 方法慢。

在性能敏感的应用程序中,这可能会成为一个问题。类型安全:BeanUtils.copyProperties 在运行时复制属性,编译器不检查类型兼容性。

如果源对象和目标对象的属性类型不匹配,则会在运行时抛出异常。异常处理:在使用反射操作时,可能会抛出反射相关的异常,如InvokingTargetException、IllegalAccessException等,需要对这些异常进行额外的处理。

依赖项:使用 BeanUtils.copyProperties 需要依赖 Apache Commons BeanUtils 库,这意味着项目需要引入这个外部依赖项。综合起来,BeanUtils.copyProperties是一种非常方便的工具方法,可以减少编码工作量,提高开发效率。

但是,在决定使用它时,您需要权衡它带来的便利性与潜在的性能影响,特别是在处理大量数据或在性能敏感的场景中。在这些情况下,您可能需要考虑直接使用 get/set 方法或寻找其他属性复制库(例如 ModelMapper、MapStruct 等)作为替代方案。

ModelMapper 是一个强大且灵活的 Java 对象映射库。它自动处理不同类对象之间的属性映射,这使得开发人员可以轻松地将属性从一个对象复制到另一个对象,即使两个对象的属性名称和类型不完全匹配。

ModelMapper通过智能匹配策略减少手动映射的需要,从而提高开发效率。以下是使用 ModelMapper 的一些优点和潜在缺点: 优点 减少样板代码:自动映射属性减少了大量手动编码工作,例如不必为每个属性编写 get 和 set 调用。

灵活性:ModelMapper提供多种配置选项,包括严格匹配策略、自定义类型映射、条件映射等,以适应复杂的映射需求。类型安全:与使用反射直接操作属性的库(例如 Apache Commons BeanUtils)相比,ModelMapper 在编译时提供了更好的类型安全性,并减少了运行时错误。

支持复杂映射:ModelMapper可以处理更复杂的映射场景,比如嵌套对象、集合到集合映射等。 缺点 性能开销:虽然ModelMapper减少了手动编码的需要,但在自动映射的过程中会有一定的性能开销过程。

在性能敏感的应用程序中,这可能会成为一个考虑因素。学习曲线:虽然基本使用相对简单,但为了充分利用 ModelMapper 提供的高级功能和配置选项,开发人员需要花时间学习其 API 和用法。

初始配置成本:对于一些复杂的映射需求,可能需要相对繁琐的配置工作来确保正确的映射行为。使用示例 下面是使用 ModelMapper 复制对象的简单示例: 首先,在项目中添加 ModelMapper 的依赖(以 Maven 为例): xml 复制代码 代码语言:javascript copy org.modelmappergroupId > modelmapperartifactId> 2.3.8version>dependency> 然后,假设有两个类,一个是实体类User,一个是传递对象UserDTO,可以使用ModelMapper复制User的实例属性到UserDTO的实例:java 复制代码 代码语言:javascript copy import org.modelmapper.ModelMapper;公共类 Main { 公共静态 void main(String[] args) { ModelMapper modelMapper = new ModelMapper();用户 user = new User("John Doe", 30) ; UserDTO userDTO = modelMapper.map(用户, UserDTO.class); System.out.println(userDTO.getName() + ", " + userDTO.getAge()); }}类用户{私有字符串名称;私有整数年龄; // 构造函数、getter 和 setter}class UserDTO { private String name;私有整数年龄; // 构造函数、getter 和 setter}ModelMapper 是对象映射领域的强大工具,适用于很多需要对象转换的对象在场景中,尤其是构建分层架构的应用程序(例如MVC应用程序)时,可以通过三种方式有效地将数据库实体转换为Java中的DTO或视图模型深复制(Deep Copy)。

Copy)意味着不仅复制对象的引用,还复制对象本身以及其中的所有对象。对于List集合的深层复制,我们需要确保复制集合中每个对象的新实例。

下面是实现List集合深拷贝的几种方法: 1、通过序列化和反序列化,该方法要求集合中的对象以及该对象内引用的所有其他对象都实现Serialized接口。 java复制代码代码语言:javascript copy import java.io.*;公共类 DeepCopy { @SuppressWarnings("unchecked") 公共静态 List deepCopy(List list) { 尝试 { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); } ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(列表); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); return (List) in.readObject(); } catch (IOException | ClassNotFoundException e ) { 抛出新的 RuntimeException(e);这种方法虽然简单,但效率不是特别高,适合没有复杂引用或者尺寸较小的集合。

2.使用第三方库如Apache Commons Lang提供的SerializationUtils类(需要添加Apache Commons Lang依赖)。 java 复制代码 代码语言: javascript copy import org.apache.commons.lang3.SerializationUtils;// 假设你的 List 包含 SomeClass 的实例 List original = new ArrayList<>();List Copy = SerializationUtils.clone((( Serialized ); 这种方法也是基于序列化机制的,比较容易使用 3. 手动实现深度复制,这需要你明确地知道集合中每个对象的结构以及如何复制这些对象。

代码语言: javascript copy import java.util.ArrayList public class ManualDeepCopy { public static List deepCopy(List originalList) { List CopyList = new ArrayList<>(); // 假设 SomeClass 已经实现了自己的深层复制逻辑 SomeClass CopyItem = item.deepCopy(); CopyList.add(copiedItem); } return CopyList; }} 在这个例子中,SomeClass 需要有一个方法来实现自己的深层复制复制逻辑,例如复制构造函数或返回对象副本的方法。选择哪种方法?如果对象结构简单且不关心性能,可以选择序列化方式。

如果对象结构复杂或者需要高性能的复制,建议手动实现深复制逻辑。第三方库方法提供了一种中间选项,该选项易于使用,但可能不如手动实现的方法灵活。

Java的各种实体复制方法及实际操作

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 上药云健康完成超10亿元B轮融资,股东结构日趋多元化

    上药云健康完成超10亿元B轮融资,股东结构日趋多元化

    上药云健康近日正式完成总金额10.33亿元B轮融资,由上海生物医药产业基金领投,建投投资、三诺生物、上海国投、联信资本、风时金控、华东实业等也参与投资。

    06-18

  • 首次发布 -高仙机器人完成1亿美元B+轮融资,美团、腾讯入局

    首次发布 -高仙机器人完成1亿美元B+轮融资,美团、腾讯入局

    投资圈(ID:pedaily)4月14日消息,高仙机器人宣布完成1亿美元B+轮融资。 仅过去一年,高仙机器人就获得了超过1亿美元的B+轮融资,投资机构包括美团、腾讯、中信建投、元一投资、蓝驰创投、博华资本、KIP资本等,投资机构有知名证券公司、互联网公司和领先的房地产开发商。

    06-17

  • 2019年第二季度全球十大晶圆代工营收排名出炉

    2019年第二季度全球十大晶圆代工营收排名出炉

    根据集邦科技旗下拓墣产业研究院最新报告统计,由于全球政经局势动荡,全球晶圆代工营收2019年第二季度代工营收需求持续疲软,各厂营收较去年同期普遍下滑。 预计第二季度全球晶圆代工总产值将较去年同期下降约8%,达到1亿美元。 市场份额排名前三的是台积电、三星和格罗方德

    06-06

  • 中国AI人才困境:留美博士88%在美国工作,谷歌5名员工参与美国军事项目

    中国AI人才困境:留美博士88%在美国工作,谷歌5名员工参与美国军事项目

    AI,正成为中美竞争焦点状态。 其中,最重要的竞争是人工智能人才的竞争。 但眼下,中美关系正处于前所未有的冰点,美国政府以阻止中国获得美国先进研究成果为由,采取行动限制留学生及其工作人员入境中国。 但讽刺的是,中国的人工智能人才实际上是美国技术领先的重要支撑。

    06-18

  • 臻知医疗完成超亿元Pre-A轮融资,加速肿瘤细胞治疗管线研发

    臻知医疗完成超亿元Pre-A轮融资,加速肿瘤细胞治疗管线研发

    臻知医疗由正心谷资本、无锡振和生物科技有限公司、上海君实生物医药科技共同投资珍吉股份有限公司 中金资本等共同创立的国际化创新型生物制药公司。

    06-17

  • TR Capital第四只基金成功募资3.5亿美元并达到规模上限

    TR Capital第四只基金成功募资3.5亿美元并达到规模上限

    2月4日,亚洲私募股权二级市场基金TR Capital今日宣布完成第四只旗舰基金——TR Capital Fund IV(下)(简称“第四基金”)最终募资(最终截止)。 该基金获得大幅超额认购,成功募资3.5亿美元,达到融资规模上限。 听,中小企业反馈平台。 倾听用户需求,倾听创业者声音,解

    06-17

  • SEMI报告:2022年全球晶圆厂设备支出将创近千亿美元历史新高

    SEMI报告:2022年全球晶圆厂设备支出将创近千亿美元历史新高

    加州时间9月14日,SEMI在其世界晶圆厂预测报告(WorldFabForecastreport)中强调,继今年全球晶圆厂预测之后工厂设备支出预计达亿元后,随着电子产品需求猛增,在数字化转型等长期技术趋势的推动下,全球半导体前段晶圆厂设备投资有望再创新高近1亿美元。 新的晶圆厂设备支出

    06-08

  • 晶泰科技完成约1500万美元B轮融资,红杉中国领投,谷歌、腾讯跟投

    晶泰科技完成约1500万美元B轮融资,红杉中国领投,谷歌、腾讯跟投

    据投资界1月24日消息,AI医药研发公司晶泰科技近日宣布,已完成约万 USD B轮融资,由红杉资本中国基金领投,谷歌跟投,A轮投资方腾讯本轮继续追加投资。   此前,晶泰科技已获得腾讯、真格基金、锋锐资本投资的数千万元A轮融资。    据悉,本轮融资完成后,晶泰科技将继

    06-18

  • 尼康进军激光雷达市场:Velodyne获2500万美元融资

    尼康进军激光雷达市场:Velodyne获2500万美元融资

    号称占据自动驾驶行业半壁江山的激光雷达市场再次被曝光。 日本百年光学巨头尼康耐不住寂寞,想要分一杯羹。 它很快就找到了强有力的支持——激光雷达传感器的市场领导者 Velodyne。 据雷锋网消息,尼康将向Velodyne投资1万美元。 未来,双方将共同开发用于自动驾驶汽车、机器

    06-06

  • 黑莓因销售业绩不佳被指上半年退出韩国市场

    黑莓因销售业绩不佳被指上半年退出韩国市场

    北京时间2月18日消息,据韩国媒体报道,黑莓正考虑上半年退出韩国市场今年的。 黑莓此前曾表示,不会在日本推出黑莓10手机,并退出日本市场。   韩媒援引匿名“业内人士”的话说,黑莓手机在韩国的销售低迷,让该公司高管开始考虑黑莓的未来。 目前,三星、LG和苹果在韩??国

    06-17

  • 赫吉亚生物完成近亿元A1轮融资,多条BIC潜力siRNA新药管线加速临床试验

    赫吉亚生物完成近亿元A1轮融资,多条BIC潜力siRNA新药管线加速临床试验

    投资界(ID:pedaily)3月28日消息,近日,杭州赫吉亚生物新锐小干扰核酸(siRNA)创新药物公司赫吉亚生物制药股份有限公司(以下简称“赫吉亚生物”)成功完成近亿元A1轮融资。 本轮融资由天士力资本领投,和达健康、上海建信资本跟投,现有股东继续跟投。 姚资本在本次交易

    06-17

  • 昆明高新区举办上市公司及优质企业投融资路演专场活动

    昆明高新区举办上市公司及优质企业投融资路演专场活动

    5月10日,由昆明高新区金融分局、昆明高新区联合主办云南省科技创新基金联合体股权投资有限公司基金之家、云南省对外科技合作协会、昆明市知识产权服务业联合举办的“争向新”投融资路演系列活动集聚区——高新区上市公司和优质企业专场活动在昆明高新区火炬大厦举行。 参加活

    06-18