Ejemplo de uso de BeanUtils.copyProperties(): referencia de objetos Java y análisis de asignación

Ejemplo de uso de BeanUtils.copyProperties(): referencia de objetos Java y análisis de asignación

Prefacio

Durante el desarrollo de un proyecto reciente, me encontré con la situación de copiar un objeto y modificar uno de sus valores de atributo. No me di cuenta de que había algún problema en ese momento. No fue hasta más tarde durante las pruebas que descubrí que no solo Se había cambiado el valor del atributo del nuevo objeto, pero también el valor del atributo del objeto original. Después de la modificación, me di cuenta de que había cometido un error muy básico, por lo que registré el análisis de las referencias de objetos y los problemas de asignación y el uso. del método BeanUtils.copyProperties().

referencia de objeto

Análisis de principios

Los objetos son variables declaradas por una clase y son responsables de almacenar referencias para garantizar que el objeto pueda operar las variables asignadas al objeto y llamar a métodos en la clase.

Cuando creamos directamente dos objetos, las referencias de los dos objetos son diferentes, como se muestra a continuación.
Insertar descripción de la imagen aquí
Si realizamos la siguiente operación de asignación, los dos objetos tendrán la misma referencia y sus referencias apuntarán a la misma entidad.

object2 = object1;

En este momento, su señal se convierte en
Insertar descripción de la imagen aquí
Aquí, todos deberían saber el problema que mencioné en el prefacio. Asigné la referencia del objeto original al nuevo objeto. En este momento, las referencias de los dos objetos son las mismas, es decir, apuntan a Para la misma entidad, cuando modifico el valor de la variable (atributo) a través de un nuevo objeto, el valor de la variable de esta entidad se modifica. Debido a que las referencias del objeto original y el nuevo objeto apuntan a esta entidad, es diferente de mis necesidades.

demostración de código

Aquí primero crea una nueva clase de usuario.

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;
}

Primero reproduzcamos mi error.

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);
    }

La salida del código es:

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=)

A través de los resultados de salida, podemos ver que la edad de la entidad señalada por la referencia del objeto sourceUser también se ha convertido en 18.

BeanUtils.copyProperties() copiar objeto

Aquí demostramos directamente BeanUtils.copyProperties() copiando objetos a través del código. Para facilitar la comparación, creamos un nuevo objeto bajo el código anterior.

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);
    }

La salida del programa es:

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=)

Combinando el código y los resultados de salida, podemos saber: Después de ejecutar **BeanUtils.copyProperties(sourceUser, targetUser);**, los resultados de salida de targetUser y sourceUser son los mismos; y luego, cuando modificamos la variable edad a 25 a través de targetUser , targetUser y Los resultados generados por sourceUser ya no son los mismos, en este momento sus referencias son diferentes y apuntan a diferentes entidades.

Conclusión

Los conceptos básicos siguen siendo demasiado importantes. Cuando aprendes por ti mismo, solo quieres repasarlos y darte cuenta rápidamente de las necesidades, ignorando así los fundamentos y principios importantes. Todavía tengo que llenar los agujeros lentamente en el futuro. El registro anterior de este problema también es una advertencia para mí. Si hay algún problema, puede señalarlo.

¡Finalmente, deseo que todos se vuelvan más fuertes!

Supongo que te gusta

Origin blog.csdn.net/weixin_55549435/article/details/131151057
Recomendado
Clasificación