IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java零基础入门 16:java反射详解 -> 正文阅读

[Java知识库]Java零基础入门 16:java反射详解

🍅 Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
🍅 基础推荐:Java基础教程系列
🍅 实战推荐:Spring Boot基础教程
🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者? 、Java架构师奋斗者💪
🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步
🍅 欢迎点赞 👍 收藏 ?留言 📝

一、前情提要

1、需求

由于某种原因,您可能在项目中遇到类似的需求:

  1. 你需要读取一个文件,比如html、json、zip等等类型的文件;
  2. 需要将文件内容存到bean中;
  3. 将bean中内容存储到数据库中;

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<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;
    }
 
    /**
      * 获取值
      * 
      * @param clazz     类
      * @param fieldName 类的属性名称
      * @return
      */
            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赋值

三、哪吒社区

1、Vue.js 3.0从入门到实战

2、SQL从入门到精通

3、MySql数据库从入门到实战

4、Oracle数据库管理从入门到精通

【赚取积分方式】哪吒社区内发帖、点赞、评论都可赢取积分!

🍅 社区入口:【打卡贴 day31】理解ThreadLocal


在这里插入图片描述

上一篇:Java零基础入门 15:java异常

下一篇:Java零基础入门 17:java类加载与初始化

在这里插入图片描述

添加微信,备注1024,赠送Java学习路线思维导图
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:10:49  更:2021-11-29 16:10:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:34:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码