目录 Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
基础推荐:Java基础教程系列
实战推荐:Spring Boot基础教程
简介:Java领域优质创作者、CSDN哪吒公众号作者✌ 、Java架构师奋斗者
扫描主页左侧二维码,加入群聊,一起学习、一起进步
欢迎点赞 收藏 ⭐留言
- 一、前情提要
- 1、需求
- 2、您可能遇到的问题
- 二、代码实例
- 1、文件中字段名
- 2、数据库中字段名
- 3、反射工具类
由于某种原因,您可能在项目中遇到类似的需求:
- 你需要读取一个文件,比如html、json、zip等等类型的文件;
- 需要将文件内容存到bean中;
- 将bean中内容存储到数据库中;
- 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 { public staticV convertByReflect(T srcObject, Class 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 T mapToBean(Map map, Class targetClazz) { T targetClass = null; try { targetClass = targetClazz.newInstance(); Field[] targetFields = targetClazz.getDeclaredFields(); for (Map.Entry 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; } public static List convertListByReflect(List srcObjectList, Class targetClazz) { List retList = new ArrayList (); try { V targetClass = targetClazz.newInstance(); for (T srcObject : srcObjectList) { targetClass = convertByReflect(srcObject, targetClazz); if (targetClass == null) { return new ArrayList (); } retList.add(targetClass); } } catch (Exception e) { log.error("convertByReflect Error {}", e.getMessage()); return new ArrayList (); } return retList; } private static Object invokeGetMethod(Object clazz, String fieldName) { String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method method = null; try { method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName); return method.invoke(clazz); } catch (Exception e) { return ""; } } private static void setFieldValue(Field field, Object obj, Object value) throws IllegalAccessException { // 获取原有的访问权限 boolean access = field.isAccessible(); try { // 设置可访问的权限 field.setAccessible(true); field.set(obj, value); } finally { // 恢复访问权限 field.setAccessible(access); } } private static void setFieldValueByType(Field targetField, Object target, Object value) throws IllegalAccessException { Class> targetType = targetField.getType(); String valueStr = String.valueOf(value); if (targetType == Integer.class) { setFieldValue(targetField, target, Integer.valueOf(valueStr)); } else if (targetType == Double.class) { setFieldValue(targetField, target, Double.valueOf(valueStr)); } else if (targetType == Float.class) { setFieldValue(targetField, target, Float.valueOf(valueStr)); } else if (targetType == Boolean.class) { setFieldValue(targetField, target, Boolean.parseBoolean(valueStr)); } else if (targetType == Long.class) { setFieldValue(targetField, target, Long.parseLong(valueStr)); } else if (targetType == Short.class) { setFieldValue(targetField, target, Short.parseShort(valueStr)); } else if (targetType == Date.class) { String dateStr = StrUtil.getDigital(valueStr); setFieldValue(targetField, target, StrUtil.stringToDate(dateStr, "yyyyMMddHHmmss")); } else { setFieldValue(targetField, target, valueStr); } } }
更多内容详见:【Java 代码实例 2】利用Java反射实现两个具有相同属性bean赋值
上一篇:Java零基础入门 15:java异常
下一篇:Java零基础入门 17:java类加载与初始化
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)