比较一个对象,如是这个对象的某一个属性不为空,把他copy到另一个有这个属性的bean中...

本文介绍了一个使用Java实现的工具,用于复制Java Bean对象的属性。该工具能够检查两个对象,将非空属性从原始对象复制到目标对象。详细说明了如何验证对象存在性、处理JavaBean属性并进行复制操作。
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class CopyBean {
 /** 
     * 比较一个对象,如是这个对象的某一个属性不为空,把他copy到另一个有这个属性的bean中 
     *  
     * @param result 要copy到的bean 
     * @param orig 原来BEAN 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     */  
    public static void copyOrigNotNullPropertyToDestBean(Object result, Object orig) throws IllegalAccessException,  
            InvocationTargetException {  
        // Validate existence of the specified beans  
        if (result == null) {  
            throw new IllegalArgumentException("No destination bean specified");  
        }  
        if (orig == null) {  
            throw new IllegalArgumentException("No origin bean specified");  
        }  
          
        if (orig instanceof Map) {  
            throw new IllegalArgumentException("No support map");  
        }  
  
        /* if (orig is a standard JavaBean) */  
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);  
        for (int i = 0; i < origDescriptors.length; i++) {  
            String name = origDescriptors[i].getName();  
            if ("class".equals(name)) {  
                continue; // No point in trying to set an object's class  
            }  
            if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(result, name)) {  
                try {  
                    Object value1 = PropertyUtils.getSimpleProperty(orig, name);  
                    if (value1 != null) {  
                         if (PropertyUtils.isReadable(result, name) && PropertyUtils.isWriteable(result, name)) {  
                             BeanUtils.copyProperty(result, name, value1);  
                         }  
                    }  
                } catch (NoSuchMethodException e) {  
                }  
            }  
        }  
  
    } 
}

转载于:https://my.oschina.net/u/933822/blog/603324

<think>好的,我现在需要回答用户关于如何在JavaScript、PythonJava中实现对象属性拷贝的问题。首先,我要回忆每种语言中深浅拷贝的同实现方式,并结合提供的引用资料来确保准确性。 对于JavaScript部分,我记得浅拷贝可以通过Object.assign或者展开运算符实现,而深拷贝可能需要使用JSON方法或者递归函数。引用[5]中的例子展示了浅拷贝的问题,即嵌套对象仍然是引用,所以修改深层属性会影响原对象。需要指出这一点,并建议使用深拷贝方法如lodash的cloneDeep或者手动递归。 Python方面,引用[3]和[4]提到浅拷贝用copy模块的copy方法,深拷贝用deepcopy。需要注意的是,对于可变对象,深浅拷贝会有区别,而可变对象如列表,浅拷贝只复制外层引用。这点要详细说明,并举例说明区别。 Java的深浅拷贝在引用[2]中提到,浅拷贝通过实现Cloneable接口并重写clone方法,但默认是浅拷贝。深拷贝需要递归复制所有可变对象,或者使用序列化等方法。需要解释Cloneable接口的使用,以及如何实现深拷贝的步骤。 还要注意用户提供的引用中的关键点,比如JavaScript的浅拷贝例子中的问题,Python可变对象的情况,以及Java中深拷贝的实现方式。需要将这些内容自然地融入到回答中,并在适当的地方添加引用标识。 外,确保回答结构清晰,分语言说明,每种语言下分浅拷贝和深拷贝,可能的话给出代码示例。同检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,但根据用户的问题,可能这方面内容多,过如果有数学表达式的话要正确应用。 最后生成相关问题,要确保问题与主题相关,比如同语言拷贝方法的比较,深浅拷贝的应用场景,如何避免常见错误等。需要参考示例中的相关问题,保持问题的连贯性和逻辑性。</think>### JavaScript/Python/Java 对象属性拷贝方法解析 --- #### 一、JavaScript 对象属性拷贝 1. **浅拷贝** - **方法**:使用 `Object.assign()` 或展开运算符 `...` - **特点**:仅复制第一层属性,嵌套对象仍为引用[^5]。 - **示例**: ```javascript const obj = { a: 1, nested: { b: 2 } }; const shallowCopy = Object.assign({}, obj); // 或 const shallowCopy = { ...obj }; ``` 2. **深拷贝** - **方法**: - `JSON.parse(JSON.stringify(obj))`:简单但无法处理函数、循环引用。 - 递归复制或第三方库(如 Lodash 的 `_.cloneDeep()`)。 - **示例**(递归): ```javascript function deepCopy(obj) { if (typeof obj !== 'object' || obj === null) return obj; const copy = Array.isArray(obj) ? [] : {}; for (const key in obj) { copy[key] = deepCopy(obj[key]); } return copy; } ``` --- #### 二、Python 对象属性复制 1. **浅拷贝** - **方法**:`copy.copy()` 或列表/字典推导式 - **特点**:外层为新对象,内层为引用[^3][^4]。 - **示例**: ```python import copy original = [[1, 2], [3, 4]] shallow = copy.copy(original) # 嵌套列表仍共享引用 ``` 2. **深拷贝** - **方法**:`copy.deepcopy()` - **特点**:完全独立的新对象,内外层均共享引用。 - **示例**: ```python import copy original = [[1, 2], [3, 4]] deep = copy.deepcopy(original) # 嵌套列表独立 ``` --- #### 三、Java 深浅拷贝实现 1. **浅拷贝** - **方法**:实现 `Cloneable` 接口并重写 `clone()` - **特点**:基本类型复制值,引用类型复制地址[^2]。 - **示例**: ```java class MyClass implements Cloneable { int num; Object ref; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); // 默认浅拷贝 } } ``` 2. **深拷贝** - **方法**: - 递归调用 `clone()` 方法。 - 序列化与反序列化(如使用 `ObjectOutputStream`)。 - **示例**(递归): ```java class MyClass implements Cloneable { int num; Object ref; @Override protected Object clone() { MyClass copy = new MyClass(); copy.num = this.num; copy.ref = this.ref.clone(); // 递归深拷贝引用对象 return copy; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值