该类库提供了基于 commons-beanutils 和 cglib(spring-core 包中,名称空间:org.springframework.cglib.beans) 的 bean 工具的二次封装。包括了属性拷贝和属性映射,以及对象属性转换为 Map。
<dependency>
<groupId>com.buession</groupId>
<artifactId>buession-beans</artifactId>
<version>x.x.x</version>
</dependency>
使用此方法,可以实现两个对象之间的属性拷贝,该方式基于 BeanCopier 实现属性的拷贝。如果 source 对象是 Map 接口的实现,则会将 Map 的 key 和 target 的属性做映射,实现同名拷贝。
import com.buession.beans.BeanUtils;
BeanUtils.copyProperties(target, source)
我们可以指定 Converter 实现自定义规则进行属性拷贝。该方式的缺点是:BeanCopier 只使用 Converter 定义的规则去拷贝属性,所以在 convert 方法中要考虑所有的属性
import com.buession.beans.BeanUtils;
import org.springframework.cglib.core.Converter;
BeanUtils.copyProperties(target, source, new Converter() {
@Override
public Object convert(Object sourceFieldValue, Class targetFieldType, Object targetSetter){
if(sourceFieldValue instanceof Short || sourceFieldValue instanceof Integer){
if(targetFieldType.isAssignableFrom(Long.class) || targetFieldType.isAssignableFrom(long.class)){
return sourceFieldValue;
}
}else if(sourceFieldValue.getClass().isAssignableFrom(targetFieldType)){
return sourceFieldValue;
}
return null;
}
});
使用此方法,可以实现两个对象之间的属性拷贝,该方式基于 BeanCopier 实现属性的拷贝。如果 source 对象是 Map 接口的实现,则会将 Map 的 key 转换为驼峰格式后和 target 的属性做映射,实现拷贝,这是 populate 和 copyProperties 的唯一区别。
import com.buession.beans.BeanUtils;
BeanUtils.populate(target, source)
我们可以指定 Converter 实现自定义规则进行属性拷贝。该方式的缺点是:BeanCopier 只使用 Converter 定义的规则去拷贝属性,所以在 convert 方法中要考虑所有的属性
import com.buession.beans.BeanUtils;
import org.springframework.cglib.core.Converter;
BeanUtils.populate(target, source, new Converter() {
@Override
public Object convert(Object sourceFieldValue, Class targetFieldType, Object targetSetter){
if(sourceFieldValue instanceof Short || sourceFieldValue instanceof Integer){
if(targetFieldType.isAssignableFrom(Long.class) || targetFieldType.isAssignableFrom(long.class)){
return sourceFieldValue;
}
}else if(sourceFieldValue.getClass().isAssignableFrom(targetFieldType)){
return sourceFieldValue;
}
return null;
}
});
使用此方法,可以实现将一个 bean 对象转换为 Map,bean 的属性作为 Map 的 Key
import com.buession.beans.BeanUtils;
Map<String, Object> result = BeanUtils.toMap(bean)