beanutils.copyproperties类型 拷贝变量名称不同的属性
时间: 2024-04-06 14:08:54 浏览: 63
在使用BeanUtils.copyProperties方法进行属性拷贝时,如果源对象和目标对象的属性名称不同,可以使用converters参数来指定属性名称转换器,将源对象的属性名称转换为目标对象的属性名称。
例如,假设源对象的属性名称为"sourceProperty",目标对象的属性名称为"targetProperty",可以创建一个属性名称转换器,将"sourceProperty"转换为"targetProperty":
```
class PropertyNameConverter implements Converter {
public Object convert(Class type, Object value) {
if (value instanceof String) {
if ("sourceProperty".equals(value)) {
return "targetProperty";
}
}
return value;
}
}
```
然后在调用BeanUtils.copyProperties方法时,将属性名称转换器添加到converters参数中:
```
BeanUtils.copyProperties(targetObject, sourceObject, new PropertyNameConverter());
```
相关问题
解读这段代码 @SuppressWarnings({ "unchecked" }) private Object updateProperty(Object source, Object target) { BeanWrapper src = new BeanWrapperImpl(source); BeanWrapper tar = new BeanWrapperImpl(target); String[] collectandnonullpropertynames = Util.getCollectandNoNullPropertyNames(source); if (collectandnonullpropertynames.length != 0) { for (int i = 0; i < collectandnonullpropertynames.length; i++) { List<Object> srclst = (List<Object>) src.getPropertyValue(collectandnonullpropertynames[i]); List<Object> tarlst = (List<Object>) tar.getPropertyValue(collectandnonullpropertynames[i]); if (srclst != null && tarlst != null) { /** 判断集合属性是否有增减,并执行相应的增减操作 */ List<Object> tobeaddedlst = subList(srclst, tarlst); List<Object> tobereducedlst = subList(tarlst, srclst); if (tobeaddedlst.size() > 0) { tarlst.addAll(tobeaddedlst); } if (tobereducedlst.size() > 0) { tarlst.removeAll(tobereducedlst); } /** 通过递归算法进行集合属性的深拷贝 */ srclst.forEach(subsource -> { Object subtarget = tarlst.stream().filter(subtaritem -> { return isSameById(subsource, subtaritem); }).findAny().orElseGet(null); if (subtarget != null) { /* 集合属性更新的递归调用 */ updateProperty(subsource, subtarget); } }); } } } else { /* 递归至最后一级无集合属性时执行的属性更新 */ BeanUtils.copyProperties(source, target, Util.getCollectandNullPropertyNames(source)); return target; } /* 当前级集合属性更新后执行的非集合属性更新 */ BeanUtils.copyProperties(source, target, Util.getCollectandNullPropertyNames(source)); return target; }
这段代码定义了一个方法`updateProperty`,它接受两个参数`source`和`target`,并返回一个`Object`类型的值。方法中使用了`@SuppressWarnings({ "unchecked" })`注解,表示忽略类型安全的警告。
接下来,方法中创建了两个`BeanWrapper`对象`src`和`tar`,用于访问`source`和`target`对象的属性。然后使用`Util.getCollectandNoNullPropertyNames(source)`方法获取`source`对象中非空属性的名称,并将它们存储在`collectandnonullpropertynames`数组中。
如果`collectandnonullpropertynames`数组不为空,方法会遍历数组中的每个属性名,依次将`source`和`target`对象中对应的属性值转换成`List<Object>`类型,并将它们分别存储在`srclst`和`tarlst`变量中。如果`srclst`不为空且`tarlst`为空,说明`target`对象中该属性的值为`null`,此时将`srclst`的值赋给`tarlst`;如果`srclst`和`tarlst`都不为空,说明`target`对象中该属性的值已经存在,此时将`srclst`的值添加到`tarlst`中。最后,方法返回`target`对象。
java深拷贝和浅拷贝区别
在Java中,深拷贝和浅拷贝是指创建新对象时对原始对象数据结构的不同复制方式。
**浅拷贝**:
- 当我们通过复制构造函数、`clone()`方法或者数组赋值等方式创建一个新的对象时,默认的是浅拷贝。
- 浅拷贝会逐个复制引用类型的成员变量,如对象、数组等。新的对象和原对象共享这些引用,所以修改其中一个对象会影响另一个。
- 对于基本类型,浅拷贝是真正的副本。
**深拷贝**:
- 深拷贝会递归地创建新对象,并对所有成员变量(包括引用类型和基本类型)都进行完整的复制。
- 如果对象中有其他对象或数组,这些都会被独立地复制一次,形成完全隔离的对象树。
- 使用序列化和反序列化,或者第三方库如`java.beans.BeanUtils.copyProperties()`也是实现深拷贝的方式之一。
总结来说,浅拷贝只复制了引用层级的第一层,而深拷贝则完整复制了整个数据结构,使得对象之间彼此独立。
阅读全文