bean实体转换工具
在实际开发中返回中经常会遇到返回实体VO,psring有个自带的转换方法,即:
BeanUtils.copyProperties();方法
但是如果返回是个list呢?用这个方法是不是要循环遍历然后赋值?方法当然可以,但是代码看起来就非常的臃肿,不雅观。所以记录一个工具,使用于单个,集合,分页的转换,让代码看起来更优雅。废话不多说,直接贴代码:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import one.util.streamex.StreamEx;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Bean 工具类
*
* @author xx
*/
@Slf4j
public class BeanUtils extends org.springframework.beans.BeanUtils {
/**
* Bean方法名中属性名开始的下标
*/
private static final int BEAN_METHOD_PROP_INDEX = 3;
/**
* 匹配getter方法的正则表达式
*/
private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");
/**
* 匹配setter方法的正则表达式
*/
private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
/**
* 根据class拷贝对象
*
* @param source 来源对象
* @param classType 需要复制成什么对象
* @param ignoreProperties 忽略的字段
* @return classType 实例
*/
public static <T> T copyPropertiesByClass(Object source, Class<T> classType, String... ignoreProperties) {
if (classType == null) {
return null;
} else {
try {
T newInstance = classType.newInstance();
if (source != null) {
copyProperties(source, newInstance, ignoreProperties);
}
return newInstance;
} catch (IllegalAccessException | InstantiationException var4) {
log.error(var4.getMessage(), var4);
return null;
}
}
}
/**
* 根据class拷贝对象列表
*
* @param sources 来源对象列表
* @param classType 需要复制成什么对象
* @param ignoreProperties 忽略的字段
* @return classType 实例列表
*/
public static <T> List<T> copyListPropertiesByClass(Collection sources, Class<T> classType, String... ignoreProperties) {
return StreamEx.of(sources)
.filter(Objects::nonNull)
.map(source -> copyPropertiesByClass(source, classType, ignoreProperties))
.toList();
}
/**
* 根据class拷贝对象Page
*
* @param page page模型
* @param classType 需要复制成什么对象
* @param ignoreProperties 忽略的字段
* @return Page 原page模型
*/
public static <T> Page<T> copyPagePropertiesByClass(Page page, Class<T> classType, String... ignoreProperties) {
page.setRecords(copyListPropertiesByClass(page.getRecords(), classType, ignoreProperties));
return page;
}
/**
* Bean属性复制工具方法。
*
* @param dest 目标对象
* @param src 源对象
*/
public static void copyBeanProp(Object dest, Object src) {
try {
copyProperties(src, dest);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取对象的setter方法。
*
* @param obj 对象
* @return 对象的setter方法列表
*/
public static List<Method> getSetterMethods(Object obj) {
// setter方法列表
List<Method> setterMethods = new ArrayList<Method>();
// 获取所有方法
Method[] methods = obj.getClass().getMethods();
// 查找setter方法
for (Method method : methods) {
Matcher m = SET_PATTERN.matcher(method.getName());
if (m.matches() && (method.getParameterTypes().length == 1)) {
setterMethods.add(method);
}
}
// 返回setter方法列表
return setterMethods;
}
/**
* 获取对象的getter方法。
*
* @param obj 对象
* @return 对象的getter方法列表
*/
public static List<Method> getGetterMethods(Object obj) {
// getter方法列表
List<Method> getterMethods = new ArrayList<Method>();
// 获取所有方法
Method[] methods = obj.getClass().getMethods();
// 查找getter方法
for (Method method : methods) {
Matcher m = GET_PATTERN.matcher(method.getName());
if (m.matches() && (method.getParameterTypes().length == 0)) {
getterMethods.add(method);
}
}
// 返回getter方法列表
return getterMethods;
}
/**
* 检查Bean方法名中的属性名是否相等。<br>
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
*
* @param m1 方法名1
* @param m2 方法名2
* @return 属性名一样返回true,否则返回false
*/
public static boolean isMethodPropEquals(String m1, String m2) {
return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
}
}
里面适用 方法:BeanUtils.copyProperties();,BeanUtils.copyPagePropertiesByClass(),BeanUtils.copyListPropertiesByClass();常用方法。