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)
上一篇 2022年10月3日 下午1:46
下一篇 2022年10月3日 下午2:00


相关推荐

  • 网站被挂马了如何清理_网站在线挂马检测工具

    网站被挂马了如何清理_网站在线挂马检测工具转自:http://sec.chinabyte.com/206/8919706.shtml不完全统计,90%的网站都被挂过马,挂马是指在获取网站或者网站服务器的部分或者全部权限后,在网页文件中插入一段恶意代码,这些恶意代码主要是一些包括IE等漏洞利用代码,用户访问被挂马的页面时,如果系统没有更新恶意代码中利用的漏洞补丁,则会执行恶意代码程序,进行盗号等危险超过。目前挂马主要是为了商业利

    2022年9月30日
    6
  • MyBatis 分页插件的实现原理

    MyBatis 分页插件的实现原理分页插件基本原理 使用 MyBatis 提供的插件接口 实现自定义插件 在插件的拦截方法内拦截待执行的 SQL 然后重写 SQL 根据 dialect 方言 添加对应的物理分页语句和物理分页参数

    2026年3月26日
    1
  • 【传Cursor拟以500亿美元估值进行融资】

    【传Cursor拟以500亿美元估值进行融资】

    2026年3月14日
    2
  • 智己汽车发布会定档!超级智能体即将亮相,揭示未来出行新趋势

    智己汽车发布会定档!超级智能体即将亮相,揭示未来出行新趋势

    2026年3月14日
    2
  • SFTP的用法

    SFTP的用法SFTP 的概念 sftp 是 SecureFileTr 的缩写 安全文件传送协议 可以为传输文件提供一种安全的网络的加密方法 sftp 与 ftp 有着几乎一样的语法和功能 SFTP 为 nbsp SSH 的其中一部分 是一种传输档案至 Blogger 伺服器的安全方式 其实在 SSH 软件包中 已经包含了一个叫作 SFTP SecureFileTr

    2026年3月26日
    2
  • 程序员法则 – 第二章[通俗易懂]

    程序员法则 – 第二章[通俗易懂]程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。  /*  */  燥热的8月即将过去,而我也坐上了重庆开往西安的列车。抱上我心爱的笔记本,载着梦想,7小时后,我就能到达那个我要呆上我整整四年的城市了。  我放好行李,把笔记本放在身边,挥手和来给我送别的母亲道别。我微微闭上眼睛,小睡7小时吧,我想着。我是属于那种带点自闭的性格,别人不找我说话,我绝对不会主动搭讪,但

    2022年10月6日
    4

发表回复

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

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