JAVA实体类属性复制工具类

源码:

package com.xsili.context.util;

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

public class CopyObjectUtil {
    
    public static String[] getNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();

        Set<String> emptyNames = new HashSet<String>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null) emptyNames.add(pd.getName());
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }

    public static void copyPropertiesIgnoreNull(Object source, Object target) {
        BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
    }

}

Java中,实体类通常是用于数据持久化的模型类,它们通常包含一些属性表示对象的状态。如果你需要对某个实体类的对象进行属性复制,以便创建一个新的与其状态相同的对象,可以使用深拷贝或浅拷贝的方式。 **浅拷贝**: 如果你只是简单地复制了对象的引用,而不是其内部属性,那么这就是浅拷贝。例如: ```java Entity original = new Entity(); original.setProperty("value"); // 浅拷贝 Entity copy = original; ``` 在这种情况下,`copy`和`original`共享同一个属性值,如果修改其中一个,另一个也会改变。 **深拷贝**: 如果你希望创建一个新的实例,并将所有属性的值都独立复制一次,避免属性之间的相互影响,你需要通过序列化反序列化、构建新对象并设置属性,或者使用工具库如`Cloneable`接口或第三方库(如Lombok的`@DeepCopy`注解)来实现深拷贝。 ```java import org.apache.commons.lang3.builder.EqualsBuilder; public class Entity implements Cloneable { private String value; // 使用Object.clone()实现深拷贝 public Entity deepCopy() throws CloneNotSupportedException { return (Entity) super.clone(); } // 或者使用equals()和HashCode进行深拷贝 @Override protected Object clone() throws CloneNotSupportedException { Entity copy = (Entity) super.clone(); copy.setValue(value); // 如果有getter和setter,这里手动设置属性值 return copy; } } // 使用深拷贝 Entity copy = new Entity(original); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值