beanutils.copyproperties 深拷贝_properties线程安全吗

beanutils.copyproperties 深拷贝_properties线程安全吗一BeanUtils.copyProperties是什么BeanUtils类全路径为org.springframework.beans.BeanUtils是spring-beans包下的一个用于bean相关工具类。BeanUtils.copyProperties(Objectsource,Objecttarget)这个方法的作用是把source这个bean的全部属性值复制到targe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一 BeanUtils.copyProperties是什么

BeanUtils类全路径为org.springframework.beans.BeanUtils是spring-beans包下的一个用于bean相关工具类。

BeanUtils.copyProperties(Object source, Object target)这个方法的作用是 把source这个bean的全部属性值 复制到 target这个bean对象

二 遇到问题BeanUtils.copyProperties(Object source, Object target)写入失败

source和 target 是两个不同类的对象,属性名称全都一样,发现其它字段都拷贝成功,但是有一个字段没有拷贝复制过来

仔细检查发现:该拷贝失败字段的类型不一样,一个是int类型 一个是String类型,

怀疑:source对象和target对象相应属性的名称和类型必须都一样才可以成功拷贝属性值,

经过修改测试发现,亲测有效, 下面阅读源代码进行确认原因。

三 阅读源码

private static void copyProperties(Object source, Object target, Class> editable, String… ignoreProperties)

throws BeansException {

Assert.notNull(source, “Source must not be null”);

Assert.notNull(target, “Target must not be null”);

Class> actualEditable = target.getClass();

if (editable != null) {

if (!editable.isInstance(target)) {

throw new IllegalArgumentException(“Target class [” + target.getClass().getName() +

“] not assignable to Editable class [” + editable.getName() + “]”);

}

actualEditable = editable;

}

PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);

List ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null);

for (PropertyDescriptor targetPd : targetPds) {

Method writeMethod = targetPd.getWriteMethod();

if (writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {

PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());

if (sourcePd != null) {

Method readMethod = sourcePd.getReadMethod();

if (readMethod != null && ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {

try {

if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {

readMethod.setAccessible(true);

}

Object value = readMethod.invoke(source);

if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {

writeMethod.setAccessible(true);

}

writeMethod.invoke(target, value);

}

catch (Throwable ex) {

throw new FatalBeanException(

“Could not copy property ‘” + targetPd.getName() + “‘ from source to target”, ex);

}

}

}

}

}

}

spring代码解释说明:

writeMethod 即相关属性的setXX方法,readMethod即 相关属性的getXX方法

ClassUtils.isAssignable(Class> lhsType, Class> rhsType)是否可以转成某个类型,根据返回值 true/false来判断 rhsType 是不是 lhsType

根据代码可以看到,依次遍历target的全部field属性,判断该属性在target中setXX方法的参数类型和 source中getXX方法的返回值类型是否一致,

如果不一致则返回,如果一致则:从source对象中通过getXX得到属性值value,再通过target该属性的set方法,把value值set进去。

四 BeanUtils.copyProperties使用总结

BeanUtils.copyProperties(Object source, Object target)方法,source对象和target对象相应属性的名称和类型必须都一样才可以成功拷贝属性值

BeanUtils.copyProperties只对bean属性进行复制,这里的复制属于浅复制。BeanUtils.copyProperties利用反射,直接将对象的引用set进去,并不是深拷贝。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186397.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 琶音的正确弹奏法

    琶音的正确弹奏法

    2021年6月6日
    143
  • 2元参数matlab图,实验二用matlab绘制一元函数与二元函数的图象-6页word资料

    2元参数matlab图,实验二用matlab绘制一元函数与二元函数的图象-6页word资料实验二用matlab绘制一元函数与二元函数的图象1.平面曲线的表示形式对于平面曲线,常见的有三种表示形式,即以直角坐标方程],[),(baxxfy∈=,以参数方程],[),(),(battyytxx∈==,和以极坐标],[),(barr∈=??表示等三种形式。2.曲线绘图的MATLAB命令可以用helpplot,helpfplot查阅有关这些命令…

    2025年8月31日
    3
  • mybatis插件运行原理_maven 插件

    mybatis插件运行原理_maven 插件最近在做新项目,基于若依(前后端分离版本)做的,他也使用了常用的分页插件PageHelper。老规矩,今天文章还是分三步走,先上文章导读,然后讲原理,最后讲解源码案例。最后达到的效果就是希望读者朋友们在看完我写的这篇文章后,能够秒懂别人写的MyBatis插件并且能够开发出自己的MyBatis的插件。文章导读MyBatis插件原理与实战什么是插件?插件就是在具体的执行流程插一脚(触发点、拦截器)来实现具体的功能。一般插件会对执行流程中的上下文有依赖,抽象的说,我们也可以把MyBatis看作是J

    2022年9月28日
    2
  • IntelliJ IDEA2018破解教程(2019.1.21更新)[通俗易懂]

    1、下载破解补丁把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为D:\IDEA\IntelliJIDEA2017.3.4\bin\JetbrainsCrack-2.7-release-str.jar破解补丁下载:破解补丁JetbrainsCrack.jar下载2、修改配置文件编辑idea.exe.vmoptions和idea…

    2022年4月6日
    863
  • 圆柱体体积的计算公式圆柱体积的计算公式_圆的面积计算公式

    圆柱体体积的计算公式圆柱体积的计算公式_圆的面积计算公式圆柱体体积计算公式?长方形的周长=(长+宽)×2正方形的周长=边长×4长方形的面积=长×宽正方形的面积=边长×边长三角形的面积=底×高÷2平行四边形的面积=底×高梯形的面积=(上底+下底)×高÷2直径=半径×2半径=直径÷2圆的周长=圆周率×直径=圆周率×半径×2圆的面积=圆周率×半径×半径长方体的表面积=(长×宽+长×高+宽×高)×2长方体的体积=长×宽×高正方体的表面积=棱长×棱长×6正…

    2022年9月20日
    5
  • Head First Java(中文版)

    Head First Java(中文版)网站更多书籍点击进入>>CiCi岛下载电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍电子书下载(皮皮云盘-点击“普通下载”)购买正版封页编辑推荐★第14届Jolt大奖的参赛图书。  ★《HeadFirstJava》使纸质图书成为了你所见过的*接近GUI的事物,使学习Java成为一种风尚。  ★Java技术无所不在——如果…

    2022年7月7日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号