java - 当我修改 BeanUtils.CopyProperties 的目标对象时,源代码被修改

标签 java list clone spring-framework-beans

我已在

的帮助下将一个对象复制到另一个对象中
BeanUtils.CopyProperties(Src,Dest);

From : package org.springframework.beans;

现在,在逻辑上更进一步,在迭代器的帮助下,我修改了 Dest 对象内的列表。

我希望 src 对象保持原样。

但我看到了一个奇怪的行为。 我的 Src 也在修改。

可能是什么原因?

示例: src 和 Dest 有列表:[芒果,苹果]

我在 iteartor 的帮助下从 Dest 中删除了 Mango。

后来我明白了
源码有[Apple]
目的地有[Apple]

这是因为浅复制而发生的吗?

最佳答案

您不想复制 List 字段,而是将其克隆到新复制的对象中。

BeanUtils.copyProperties(Object source, Object target) 在其 javadoc 中没有明确说明,但它会从一个对象到另一个对象进行浅拷贝。

这意味着在target对象中,List字段将引用与source对象中的同一对象。

因此,修改一个或另一个对象的 List 字段将反射(reflect)在另一个对象中。

要创建新的 List,您应该创建一个新的 List 实例,其中包含源 List 中的实际元素,并将其分配给目标对象中的 List 字段.

例如:

MyObject source = ...;
MyObject target = ...;

BeanUtils.copyProperties(source, target);
...
List<String> newList = new ArrayList<>(source.getList());
target.setList(newList);

关于java - 当我修改 BeanUtils.CopyProperties 的目标对象时,源代码被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611934/

相关文章:

java - 安卓按键延迟?

java - 如何迭代2个数组列表

android - 以编程方式克隆 Android 应用程序

git - 我需要做一个 Git 克隆吗?

java - 重放非循环 gif 图像

java - 从排序列表中获取间隔的最快方法?

java - 如何从 flutter 中正确调用 android native 代码(包括 android/IOS)?

C++ 在同一个程序中使用不同的代码来处理 vector 和列表的排序

Python - 列表组合

object - 是否有克隆 CLOS 对象的通用方法?