利用 Java 反射实现两个具有相同属性 bean 赋值
2、您可能遇到的问题
html 的内容字段与你存储的数据库字段,字段名无法完全对应,比如大小写问题?
因为是读取文件,所以不知道数据的类型,只能暂时都看做 String 类型,但这又与数据库中的定义不符,所以也是需要转换的。
二、代码实例
1、文件中字段名
package com.guor.entity;
import java.util.Date;
public class UserTxt {
private String ID;
private String USERname;
private String Age;
private String Address;
private String School;
private String create_date;
private String update_date;
private String DELeted;
}
2、数据库中字段名
package com.guor.entity;
import java.util.Date;
public class User {
private Integer id;
private String username;
private Integer age;
private String address;
private String school;
private Date createDate;
private Date updateDate;
private Integer deleted;
}
3、反射工具类
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class ReflectUtil {
/**
不同类型,类似属性名称,两个 bean 之间的赋值,默认数据源 bean 类型都为 String
*/
public static <T, V> V convertByReflect(T srcObject, Class<V> targetClazz) {
V targetClass = null;
try {
Class<?> srcClazz = Class.forName(srcObject.getClass().getName());
targetClass = targetClazz.newInstance();
// 获取两个实体类的所有属性
Field[] srcFields = srcClazz.getDeclaredFields();
Field[] targetFields = targetClazz.getDeclaredFields();
// 遍历 srcFields,获取属性值,然后遍历 targetObject 查找是否有相同的属性,如有相同则根据类型赋值
for (Field srcField : srcFields) {
Object value = invokeGetMethod(srcObject, srcField.getName());
for (Field targetField : targetFields) {
if (srcField.getName().toLowerCase().equals(targetField.getName().toLowerCase())) {
// 两个类型是否相同
if (srcField.getType().equals(targetField.getType())) {
setFieldValue(targetField, targetClass, value);
} else {
setFieldValueByType(targetField, targetClass, value);
}
}
}
}
} catch (Exception e) {
log.error("convertByReflect Error {}", e.getMessage());
return null;
}
return targetClass;
}
public static <V, T> T mapToBean(Map< 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 String, V> map, Class<T> targetClazz) {
T targetClass = null;
try {
targetClass = targetClazz.newInstance();
Field[] targetFields = targetClazz.getDeclaredFields();
for (Map.Entry<String, V> entry : map.entrySet()) {
for (Field targetField : targetFields) {
if (entry.getKey().toLowerCase().equals(targetField.getName().toLowerCase())) {
// 两个类型是否相同
if (entry.getValue().getClass().getTypeName().equals(targetField.getType())) {
setFieldValue(targetField, targetClass, entry.getValue());
} else {
setFieldValueByType(targetField, targetClass, entry.getValue());
}
}
}
}
} catch (Exception e) {
log.error("mapToBean Error {}", e.getMessage());
return null;
}
return targetClass;
}
/**
不同类型,类似属性名称,两个 List<bean>之间的赋值,默认数据源 bean 类型都为 String
*?
@param srcObjectList 数据源 List<bean>
@param targetClazz ? 目标类 Class
@return
*/
public static <T, V> List<V> convertListByReflect(List<T> srcObjectList, Class<V> targetClazz) {
List<V> retList = new ArrayList<V>();
try {
V targetClass = targetClazz.newInstance();
for (T srcObject : srcObjectList) {
targetClass = convertByReflect(srcObject, targetClazz);
if (targetClass == null) {
return new ArrayList<V>();
}
retList.add(targetClass);
}
} catch (Exception e) {
log.error("convertByReflect Error {}", e.getMessage());
return new ArrayList<V>();
}
return retList;
}
/**
评论