java反射机制原理详解

java反射机制原理详解????Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)????基础推荐:Java基础教程系列????实战推荐:SpringBoot基础教程????简介:Java领域优质创作者????、CSDN哪吒公众号作者✌、Java架构师奋斗者????????扫描主页左侧二维码,加入群聊,一起学习、一起进步????欢迎点赞????收藏⭐留言????目录一、前情提要1、需求由于某种原因,您可能在项目中遇到类似的需求:你需要读取一个文件,比

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

? 作者简介:哪吒,CSDN2021博客之星亚军?、新星计划导师✌、博客专家?

? 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

? 关注公众号【哪吒编程】,回复1024,获取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赋值

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

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

在这里插入图片描述


关注公众号,回复1024,获取Java学习路线思维导图、加入万粉计划交流群

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172690.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ORA-01102的解决办法

    ORA-01102的解决办法

  • Eclipse深度患者设置VSCode快捷键「建议收藏」

    Eclipse深度患者设置VSCode快捷键「建议收藏」VSCode设置Eclipse中常用的快捷键将eclipse中一些基本的快捷键输入右侧用户快捷键设置中://Placeyourkeybindingsinthisfiletooverwritethedefaults[{"key":"alt+/","command":"editor.action.triggerSuggest","when":…

  • Error filterStart的问题

    Error filterStart的问题今天出现这个问题由于只是报了一个error,不能解决问题,所以网上找了找关于这的问题可以在项目的WEB-INF/classes目录下新建一个文件叫logging.properties内容如下

  • 树、二叉树(完全二叉树、满二叉树)概念图解「建议收藏」

    树、二叉树(完全二叉树、满二叉树)概念图解「建议收藏」1、树的定义树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树。2、树的概念结点的度:一个结点拥有子树的个数称为度。比如A的度为3,C的度为2,H的度为0。度为0的结点称为叶子节点(D,F,G,H)。树的度是树中所有结点的度的最大值,此树的度为3。 树中结点的最大层次成为树的深度或高度。此树的深度为4。 父节点A的子结点B,C,D;B,C,D也是兄弟节点…

  • 十进制的小数转换为二进制的方法_二进制转十进制公式

    十进制的小数转换为二进制的方法_二进制转十进制公式今天在学习十进制与二进制的相互转换,学到小数的十进制转换到二进制时,所以我想着能不能用我这菜鸡技术,利用C++来实现只把十进制小数转换成二进制。【思路】输入要计算的二进制小数部分“decimals”以及要计算出的二进制位数循环while()部分●进行小数*2的运算,只输出整数部分(获得二进制数值),这部分利用了floor()函数,它会返回比参数小的最大整数●把整数…

  • navicatfor激活码(注册激活)

    (navicatfor激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~2K…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号