类对象转换工具类
在工作中总是需要把一个类转换成另一个类,手动new一个然后再进行赋值十分繁琐,封装了一个工具类可以很好得进行转换,并且相同的字段名的属性也会进行赋值;
代码如下:
package com.zhqc.cloud.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.beans.BeanCopier;
import org.apache.commons.collections.CollectionUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* BeanCopier对象转换工具
* 注意:禁止转化类使用链式调用
*
* @author zdd
*/
@Slf4j
public class ConvertUtil {
public static <T> List<T> castList(List<?> obj, Class<T> targetCls) {
if (CollectionUtils.isEmpty(obj)) {
return new ArrayList<>();
}
BeanCopier beanCopier = BeanCopier.create(obj.get(0).getClass(), targetCls, false);
List<T> returnList = new ArrayList<>();
try {
for (Object var : obj) {
T result = cast(var, targetCls, null, beanCopier);
returnList.add(result);
}
} catch (Exception e) {
log.error("对象转换异常", e);
}
return returnList;
}
public static <T> List<T> castList(List<?> obj, Class<T> targetCls, Map<String, String> fieldMap) {
if (CollectionUtils.isEmpty(obj)) {
return new ArrayList<>();
}
BeanCopier beanCopier = BeanCopier.create(obj.get(0).getClass(), targetCls, false);
List<T> returnList = new ArrayList<>();
try {
for (Object var : obj) {
T result = cast(var, targetCls, fieldMap, beanCopier);
returnList.add(result);
}
} catch (Exception e) {
log.error("对象转换异常", e);
}
return returnList;
}
public static <T> T cast(Object obj, Class<T> clazz) {
BeanCopier beanCopier = BeanCopier.create(obj.getClass(), clazz, false);
return cast(obj, clazz, null, beanCopier);
}
public static <T> T cast(Object obj, Class<T> clazz, Map<String, String> fieldMap) {
BeanCopier beanCopier = BeanCopier.create(obj.getClass(), clazz, false);
return cast(obj, clazz, fieldMap, beanCopier);
}
/**
* 支持不同字段映射,效率稍低,支持父类字段间映射
*/
private static <T> T cast(Object obj, Class<T> clazz, Map<String, String> fieldMap, BeanCopier beanCopier) {
if (obj == null) {
return null;
}
try {
T result = clazz.getDeclaredConstructor().newInstance();
beanCopier.copy(obj, result, null);
if (fieldMap != null) {
for (Map.Entry<String, String> entry : fieldMap.entrySet()) {
String sourceFieldName = entry.getKey();
String targetFieldName = entry.getValue();
try {
// 尝试获取源对象的字段
Field sourceField = findField(obj.getClass(), sourceFieldName);
sourceField.setAccessible(true);
Object fieldValue = sourceField.get(obj);
if (fieldValue != null) {
// 设置目标对象的字段
Field targetField = findField(clazz, targetFieldName);
targetField.setAccessible(true);
targetField.set(result, fieldValue);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
log.error("复制字段时出错:{}", e.getMessage());
}
}
}
return result;
} catch (Exception e) {
log.error("对象转换异常", e);
return null;
}
}
private static Field findField(Class<?> clazz, String fieldName) throws NoSuchFieldException {
try {
return clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
// 如果在当前类中找不到字段,则尝试在父类中查找
Class<?> superclass = clazz.getSuperclass();
if (superclass != null) {
return findField(superclass, fieldName);
} else {
throw e;
}
}
}
/**
* pageInfo转换
*/
public static <T> PageInfo<T> castPageInfo(PageInfo<?> pageInfo, Class<T> clazz) {
PageInfo<T> result = new PageInfo<>();
result.setPageNum(pageInfo.getPageNum());
result.setPageSize(pageInfo.getPageSize());
result.setTotal(pageInfo.getTotal());
result.setPages(pageInfo.getPages());
result.setList(castList(pageInfo.getList(), clazz));
return result;
}
}