复制两个类的相同属性

/**
* 复制两个类的相同属性
* 
* @param source
* @param dest
* @throws Exception
*/
public static void copySameProperty(Object source, Object dest) throws Exception {
// 获取属性
BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(), Object.class);
PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors();

BeanInfo destBean = Introspector.getBeanInfo(dest.getClass(), Object.class);
PropertyDescriptor[] destProperty = destBean.getPropertyDescriptors();
try {
for (int i = 0; i < sourceProperty.length; i++) {

for (int j = 0; j < destProperty.length; j++) {
if (sourceProperty[i].getName().equals(destProperty[j].getName()) && sourceProperty[i].getPropertyType() == destProperty[j].getPropertyType()) {
destProperty[j].getWriteMethod().invoke(dest, sourceProperty[i].getReadMethod().invoke(source));
break;
}
}
}
} catch (Exception e) {
throw new Exception("属性复制失败:" + e.getMessage() + destProperty + sourceProperty);
}
}

 

转载于:https://www.cnblogs.com/dzhou/p/11236237.html

### Java 深拷贝与浅拷贝工具实现 #### 浅拷贝的局限性及其适用范围 当涉及到对象的复制时,浅拷贝仅创建新对象,并将原对象中基本数据型的值简单赋给新对象;而对于引用型,则只是复制了指向同一地址空间的对象引用。这意味着,在完成浅拷贝之后,源对象与其副本之间仍然存在关联——即两者共同持有某些内部组件或子对象实例。因此,任何一方对这部分共享资源所做的更改都会影响到另一方[^1]。 ```java public class ShallowCopyExample implements Cloneable { private String name; private ArrayList<String> list; public Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` 上述代码展示了如何通过继承 `Cloneable` 接口并重写默认的 `clone()` 方法来进行简单的浅拷贝操作。需要注意的是,默认情况下此方法不会递归地克隆复合成员变量(如列表),而是继续让二者保持相同的引用关系。 #### 实现深拷贝的方法探讨 为了达到真正的独立性,即确保被复制出来的每一个组成部分都是全新的实体而非原有部分的一个视图,就需要采用所谓的“深拷贝”。这可以通过序列化机制来轻松达成:先将整个目标对象转换成字节流形式保存下来,再读取该字节流重建一个新的同构体出来。这样做可以彻底切断旧有连接,从而获得一份完全分离的新版本[^2]。 ```java import java.io.*; public class DeepCopyUtil { /** * 使用序列化技术执行深拷贝. */ @SuppressWarnings("unchecked") public static <T extends Serializable> T deepCopy(T object) { try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream in = new ObjectInputStream(bis)) { // 序列化至字节数组 out.writeObject(object); // 反序列化回对象 return (T) in.readObject(); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e.getMessage(), e); } } } ``` 这段代码定义了一个通用型静态函数用于执行基于Java内置I/O库的功能强大的深拷贝过程。它接受任意实现了Serializable接口的对象作为参数输入,并返回其深层复制的结果。值得注意的是,这种方法依赖于待处理项能够支持完整的序列化协议,否则将会抛出异常终止程序运行。 另外一种常见的做法是利用第三方框架提供的功能更加强大灵活的映射器,例如Apache Commons Lang中的SerializationUtils或者Spring Framework下的BeanUtils等。这高级别的API往往封装好了底层细节,允许使用者更加便捷高效地完成复杂的属性级联复制任务而不必担心兼容性和性能方面的问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值