BeanUtils.copyProperties() 사용 예 - Java 객체 참조 및 할당 분석

BeanUtils.copyProperties() 사용 예 - Java 객체 참조 및 할당 분석

머리말

최근 프로젝트를 개발하면서 객체를 복사하고 해당 속성 값 중 하나를 수정하는 상황이 발생했는데 당시에는 문제가 있다는 것을 깨닫지 못했습니다. 새 객체의 속성값도 변경됐지만 원래 객체의 속성값도 변경됐는데, 수정 후 아주 기본적인 실수를 했다는 걸 깨닫고 객체 참조 및 할당 문제 분석과 사용 방법을 기록했습니다. BeanUtils.copyProperties() 메소드 중 하나입니다.

객체 참조

원리분석

객체는 클래스에 의해 선언된 변수이며 객체가 객체에 할당된 변수를 작동하고 클래스의 메서드를 호출할 수 있도록 참조를 저장하는 역할을 합니다.

두 개체를 직접 새로 만들면 아래와 같이 두 개체의 참조가 다르며,
여기에 이미지 설명을 삽입하세요.
다음 할당 작업을 수행하면 두 개체는 동일한 참조를 가지며 해당 참조는 동일한 엔터티를 가리킵니다.

object2 = object1;

이때 그들의 포인팅은
여기에 이미지 설명을 삽입하세요.
여기에서 제가 서문에서 언급한 문제를 모두가 알아야 합니다. 원래 개체의 참조를 새 개체에 할당했습니다. 이때 두 개체의 참조는 동일합니다. 동일한 엔터티에 대해 새 개체를 통해 변수(속성) 값을 수정하면 이 엔터티의 변수 값이 수정됩니다. 원본 개체와 새 개체의 참조가 이 엔터티를 가리키기 때문에 서로 다릅니다. 내 필요에서.

코드 데모

여기서 먼저 새로운 User 클래스를 생성합니다.

package com.example.studytest.entity;

import lombok.Data;

/**
 * @Description:  User
 * @Author:       Olrookie
 * @Date:         2023/6/11
 */
@Data
public class User {
    
    

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private int age;

    /**
     * 性别
     */
    private String sex;
}

먼저 내 실수를 재현해보자

public void test() {
    
    
        System.out.println("test开始执行!!");

        // 新建一个原对象sourceUser
        User sourceUser = new User();
        sourceUser.setName("小陈");
        sourceUser.setAge(25);
        sourceUser.setSex("女");

        System.out.println("原始sourceUser:" + sourceUser);

        // 新建一个对象tempUser,将原对象sourceUser的引用赋值给tempUser
        User tempUser = new User();
        tempUser = sourceUser;
        System.out.println("赋值后的tempUser:" + tempUser);
        // 通过新对象tempUser修改变量age的值
        tempUser.setAge(18);
        
        System.out.println("tempUser修改Age属性后的tempUser:" + tempUser);
        System.out.println("tempUser修改Age属性后的sourceUser:" + sourceUser);
    }

코드의 출력은 다음과 같습니다.

test开始执行!!
原始sourceUser:User(name=小陈, age=25, sex=)
赋值后的tempUser:User(name=小陈, age=25, sex=)
tempUser修改Age属性后的tempUser:User(name=小陈, age=18, sex=)
tempUser修改Age属性后的sourceUser:User(name=小陈, age=18, sex=)

출력 결과를 통해 sourceUser 객체의 참조가 가리키는 엔터티의 나이도 18세가 되었음을 알 수 있습니다.

BeanUtils.copyProperties() 복사 객체

여기에서는 코드를 통해 객체를 복사하는 BeanUtils.copyProperties()를 직접 보여 주며, 비교의 편의를 위해 위 코드 아래에 새로운 객체를 생성합니다.

public void test() {
    
    
        System.out.println("test开始执行!!");

        // 新建一个原对象sourceUser
        User sourceUser = new User();
        sourceUser.setName("小陈");
        sourceUser.setAge(25);
        sourceUser.setSex("女");

        System.out.println("原始sourceUser:" + sourceUser);

        // 新建一个对象tempUser,将原对象sourceUser的引用赋值给tempUser
        User tempUser = new User();
        tempUser = sourceUser;
        System.out.println("赋值后的tempUser:" + tempUser);
        tempUser.setAge(18);
        System.out.println("tempUser修改Age属性后的tempUser:" + tempUser);
        System.out.println("tempUser修改Age属性后的sourceUser:" + sourceUser);

        // 新建一个对象targetUser,通过BeanUtils.copyProperties()方法进行对象拷贝
        User targetUser = new User();
        BeanUtils.copyProperties(sourceUser, targetUser);
        System.out.println("复制后的targetUser:" + targetUser);
        // 通过对象targetUser修改变量age
        targetUser.setAge(25);
        System.out.println("修改完Age属性后的targetUser:" + targetUser);
        System.out.println("targetUser修改完Age属性后的sourceUser:" + sourceUser);
    }

프로그램의 출력은 다음과 같습니다.

test开始执行!!
原始sourceUser:User(name=小陈, age=25, sex=)
赋值后的tempUser:User(name=小陈, age=25, sex=)
tempUser修改Age属性后的tempUser:User(name=小陈, age=18, sex=)
tempUser修改Age属性后的sourceUser:User(name=小陈, age=18, sex=)
复制后的targetUser:User(name=小陈, age=18, sex=)
修改完Age属性后的targetUser:User(name=小陈, age=25, sex=)
targetUser修改完Age属性后的sourceUser:User(name=小陈, age=18, sex=)

코드와 출력 결과를 결합하면 **BeanUtils.copyProperties(sourceUser, targetUser);**를 실행한 후 targetUser와 sourceUser의 출력 결과가 동일하며, targetUser를 통해 age 변수를 25로 수정하면 알 수 있습니다. , targetUser 및 sourceUser의 결과 출력은 더 이상 동일하지 않습니다. 이때 해당 참조는 다르며 다른 엔터티를 가리킵니다.

결론

아직은 기본이 너무 중요해서 혼자 배우다 보면 그냥 짚고 넘어가기만 하고 빨리 요구사항을 깨닫기만 하여 중요한 기초와 원칙을 무시하게 됩니다. 앞으로는 천천히 구멍을 메워야 겠지만 위의 문제 기록은 나 자신에게 주는 경고이기도 하니 문제가 있으면 지적해주시면 감사하겠습니다.

마지막으로 모두가 강해졌으면 좋겠습니다!

추천

출처blog.csdn.net/weixin_55549435/article/details/131151057