beanUtils.copy_拷贝板原理

beanUtils.copy_拷贝板原理本文用实例介绍BeanUtils的拷贝原理。

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

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

原文网址:BeanUtils–浅拷贝–实例/原理_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文用实例介绍BeanUtils的拷贝原理。

概述

        BeanUtils是浅拷贝。

        如果要拷贝的成员是基本数据类型,它会拷贝成员的值,相当于数据是独立的。这里的基本数据类型包括基础类型和包装类型,例如:Integer、int、String、Long、long等)

        如果要拷贝的成员不是基本数据类型,就拷贝引用地址(使用同一个引用地址(也就是:同一个对象))。

实例

代码

Entity

User

package com.knife.entity;

import lombok.Data;

@Data
public class User {
    private Long id;

    private String userName;

    private UserDetail userDetail;
}

UserDetail

package com.knife.entity;

import lombok.Data;

@Data
public class UserDetail {
    private Long id;

    private String address;
}

Controller

package com.knife.controller;

import com.knife.entity.User;
import com.knife.entity.UserDetail;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/test")
    public String test() {
        User user = new User();
        user.setId(1L);
        user.setUserName("Tony");

        UserDetail userDetail = new UserDetail();
        userDetail.setId(2L);
        userDetail.setAddress("上海");
        user.setUserDetail(userDetail);

        User user1 = new User();
        BeanUtils.copyProperties(user, user1);

        return "test success";
    }
}

测试

打断点:

beanUtils.copy_拷贝板原理

访问:http://localhost:8080/test

结果:

beanUtils.copy_拷贝板原理

可以看到,user和user1它们的userDetail成员是同一个对象:{UserDetail@6602}

原理分析

打断点

beanUtils.copy_拷贝板原理

访问:http://localhost:8080/test

运行到这个地方:

BeanUtils#copyProperties(java.lang.Object, java.lang.Object, java.lang.Class<?>, java.lang.String…)

如下图所示:

beanUtils.copy_拷贝板原理

可以看到,targetPds里边包含了目标对象的所有成员,依次对它处理,看它下半部分的代码:

beanUtils.copy_拷贝板原理

        可以发现,它是使用反射,先调用源对象的getXxx方法获取值,再调用目标对象的setXxx方法将值设置进去。

        所以,当成员是基本类型之外的对象时,它getXxx会获取到引用地址,setXxx会将引用地址设置进去,所以会共用同一个对象。

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

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

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


相关推荐

  • mysql Navicat 15 激活码(JetBrains全家桶)

    (mysql Navicat 15 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月20日
    102
  • 相机的光圈大小有什么区别「建议收藏」

    相机的光圈大小有什么区别「建议收藏」很多人单反相机已经用了很久了,但是对于光圈的设置还是不是很清楚,大光圈和小光圈到底有什么区别?拍摄一些场景到底要用什么参数?一起来看看吧。方法/步骤什么叫大光圈:在单反相机当中有一个指标叫做光圈,光圈

    2022年8月4日
    8
  • mybatis二级缓存的作用范围_java缓存机制

    mybatis二级缓存的作用范围_java缓存机制应用场景:      对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。      实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、6…

    2022年9月20日
    2
  • RTSP协议

    RTSP协议1、RTSP简介RTSP(RealTimeStreamingProtocol)是由RealNetwork和Netscape共同提出的如何有效地在IP网络上传输流媒体的应用层协议。RTSP对流

    2022年7月2日
    36
  • Updating indexes

    Updating indexesUpdatingindexesUpdatingindexes是Maven在下载更新,解决办法如下:Window–>Preferences–>MyeclipseEnterpriseWorkbench–>Maven4Myeclipse–>Maven–>去除Downloadrepositoryindexupdatesons…

    2025年6月16日
    2
  • java socket 实现原理_java socket原理

    java socket 实现原理_java socket原理TCP/IP模型中有5层结构:应用层、传输层、网络层、数据链路层以及物理层。其中IP协议是位于网络层的,TCP协议是位于传输层的,通过IP协议可以使两台计算机使用同一种语言,从而允许Internet上连接不同类型的计算机和不同的操作系统的网络,IP协议只能保证计算机能够接收和发送分组数据,当计算机要和远程的计算机建立连接时,TCP协议会让它们建立连接:用于发送和接收数据的虚拟电路。在Java中…

    2022年7月7日
    18

发表回复

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

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