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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 点云数据标注_点云数据采集

    点云数据标注_点云数据采集一:什么是点云数据点云数据是指在一个三维坐标系统中的一组向量的集合。这些向量通常以X,Y,Z三维坐标的形式表示,而且一般主要用来代表一个物体的外表面形状。不经如此,除(X,Y,Z)代表的几何位置信息

    2022年8月3日
  • kettle工具的作用和使用「建议收藏」

    kettle工具的作用和使用「建议收藏」最近公司一个同事离职,由我来接手他手上的一个项目,我负责开发后台,因为设计到脚本统计数据,需要做定时任务将日表数据统计到月表或者年表。于是该项目用到了Kettle,用了之后才发现,这是个好东西啊。一.了解Kettle工具Kettle最早是一个开源的ETL工具,以Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。二.Kettle下载和安装1.官网下载地址:https

    2022年10月16日
  • Node.js的安装及环境配置【超详细】

    Node.js的安装及环境配置【超详细】Step1:去官网下载安装包下载方式1:官网下载根据自己电脑系统及位数选择。注意:图中.msi和.zip格式区别:1、.msi是Windowsinstaller的数据包,实际上是一个数据库,提供安装,修改,卸载你所安装的程序。此外:它还包含有关安装过程本身的信息。例如:安装序列、目标文件夹路径、安装选项和控制安装过程的属性。2、.zip是一个压缩包,解压之后即可,不需要安装。…

    2022年6月11日
  • java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]

    java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]一.OOP的特点(1)万物皆为对象;(2)程序是对象的集合,他们通过发送信息来告诉彼此所要做的;(3)每一个对象都有自己的由其它对象所构成的存储;(4)每一个对象都拥有它的类型;(5)某一特定类型的对象都能够接收相同的消息;二.Java比C++简单?(1)Java有垃圾回收器,不用手动销毁对象;(2)Java使用单根继承;(3)Java仅仅能以一种方式创建对象(在堆上创建);…

    2022年7月8日
  • mse函数(均方误差函数)_二次代价函数有什么用

    mse函数(均方误差函数)_二次代价函数有什么用MSE均方误差(L2loss)1.代码展示MAE和MSE图片特性importtensorflowastfimportmatplotlib.pyplotaspltsess=tf.Session()x_val=tf.linspace(-1.,-1.,500)target=tf.constant(0.)#计算L2_lossl2_y_val=tf…

    2022年9月29日
  • Java的八种基本数据类型

    Java的八种基本数据类型1.byte:字节1.计算机中,数据传输大多是以“位”(bit,比特)为单位。2.一位就代表一个0或1(二进制),每8个位(bit)组成一个字节(byte),所以,1个字节=8位0101代码。2.short3.int4.long5.float6.double7.char1.char类型占2个字节(16位),用来表示字符。2.char是基本数据类型。String表示字符串,是类类型。一个String是由0~n个char组成。3.字符使用单引号表示,字符串使用双引号表示。8.boolea

    2022年7月7日

发表回复

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

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