写点什么

利用 Java 反射实现两个具有相同属性 bean 赋值

  • 2022 年 5 月 14 日
  • 本文字数:1739 字

    阅读完需:约 6 分钟

2、您可能遇到的问题

  1. html 的内容字段与你存储的数据库字段,字段名无法完全对应,比如大小写问题?

  2. 因为是读取文件,所以不知道数据的类型,只能暂时都看做 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;


}


/**

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
利用Java反射实现两个具有相同属性bean赋值_程序员_爱好编程进阶_InfoQ写作社区