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


相关推荐

  • NASM汇编_nasm标准

    NASM汇编_nasm标准操作指令MOV  dst,src 把src的内容复制到dst中,操作字长由参数字长决定push   把参数入栈pop     从栈顶弹出数据,存入给定参数中PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.(在不同模式下面,对应不同的寄存器,如32bit模式,对应32位寄存器)POPA   把DI,SI,BP,SP,BX,DX,C

    2022年8月30日
    1
  • java getmethod 找不到方法_java.math.bigdecimal

    java getmethod 找不到方法_java.math.bigdecimal对应的getXXX()方法MethodgetMethod=classType.getMethod(getMethodName,newClass[]{});//获得和属性对应的setXXX()方法MethodsetMethod=class……();Classc=t.getClass();Classs=c.getSuperclass();如果你在编译…

    2022年9月24日
    2
  • Android ConstraintLayout布局详解[通俗易懂]

    Android ConstraintLayout布局详解[通俗易懂]前言之前在使用AndroidStudio新建项目的时候,发现MainActivity的默认布局从RelativeLayout变成了ConstraintLayout。当时就对这个ConstraintLayout很好奇,就研究了一下。发觉确实很强大,在此做个总结。ConstraintLayout定义什么是ConstraintLayout呢?ConstraintLayout是Google在2016年的

    2022年5月5日
    87
  • 计算机网络ip地址划分方法,ip地址怎么划分 ip地址划分方法【图文】

    计算机网络ip地址划分方法,ip地址怎么划分 ip地址划分方法【图文】IP地址指的是互联网的协议地址,它的全称为IPAddress,IP地址是IP协议当中的一种地址格式,互联网上的任意一个网络以及它们的主机使用的逻辑地址都是由IP地址分配的,那么你知道IP地址是怎样进行划分的吗?下面我们就一起来看看IP地址的划分以及IP地址的查询方法吧。一、IP地址的划分:IP地址一个包括五大类,分别是A类IP地址、B类IP地址、C类IP地址、D类IP地址和E类IP地址。其中A类…

    2022年6月9日
    33
  • 1156针cpu排行_755针最强CPU

    1156针cpu排行_755针最强CPUIntel酷睿i7875K¥2330CPU主频:2930MHz智能加速:3600MHz插槽类型:LGA1156制作工艺:45纳米二级缓存:4×256KB三级缓存:8M核心数量:四核心核心类型:Lynnfield线程数:八线程总线类型:DMI总线热设计功耗(TDP):95W内核电压:0.65-1.40V内存控制器:双通道DDR3-1066/1333最大16G64位处理器。…

    2022年9月20日
    1
  • mac。idea2021激活码[在线序列号]

    mac。idea2021激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    74

发表回复

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

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