首页 > 编程语言 >[java] 利用反射,将对象A中与对象B中字段名相同的属性值赋予对象B

[java] 利用反射,将对象A中与对象B中字段名相同的属性值赋予对象B

时间:2023-06-24 23:23:38浏览次数:72  
标签:origin Object java target 对象 object Field getClass 字段名

前言:

最近开发遇到了这样一个需求,前端提交的表单对应类是origin,但后端数据库表对应类是target,两者中有重合字段,origin类中有待处理字段(例如String[] ids),我想到的解决方案是将origin对象中与target对象的同名字段值赋予target,再将待处理字段拆分后赋予target进行存储。首先想到的就是手动赋值(target.setValue(origin.getValue);)但这样不利于扩展并且不符合开闭原则。

所以使用反射进行同名字段赋值。

流程图:

sameFieldSetValue()

 

getValue():                    

setValue():

 

 

 

 

 

 

代码:

sameFieldSetValue():

private <T> T sameFieldSetValue(Object origin, T target){
        Field[] originFields = origin.getClass().getDeclaredFields();
        Field[] targetFields = target.getClass().getDeclaredFields();

        //遍历各对象寻找相同名字段,并赋值
        for(int i=0; i<originFields.length; i++){
            String originFieldName = originFields[i].getName();
            for(int j=0; j<targetFields.length; j++){
                if(targetFields[j].getName().equals(originFieldName)){
                    Object field = getValue(origin, originFieldName);
                    setValue(target, originFieldName, field);
                }
            }
        }
        return target;
    }

getValue():

private Object getValue(Object object, String fieldName) {
        try{
            Field[] fields = object.getClass().getDeclaredFields();

            for (Field field : fields) {
                String fName = field.getName();
                if (!fName.equals(fieldName)) {
                    continue;
                }

                //获取对应字段的属性描述器并获取get方法,使用invoke调用
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fName, object.getClass());
                Method getMethod = propertyDescriptor.getReadMethod();
                if (getMethod != null) {
                    return getMethod.invoke(object);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

setValue():

    private void setValue(Object object, String fieldName, Object value){
        try{
            Field[] fields = object.getClass().getDeclaredFields();
            for (int i=0; i<fields.length; i++){
                String fName = fields[i].getName();
                if(!fName.equals(fieldName)){
                    continue;
                }

                //获取对应字段的属性描述器并获取set方法,使用invoke调用
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fName, object.getClass());
                Method setMethod = propertyDescriptor.getWriteMethod();
                if (setMethod != null) {
                    setMethod.invoke(object, value);
            break; } } } catch (Exception e){ e.printStackTrace(); } }

 

参考:java利用反射交换两个对象中的字段相同的字段值 - 思思博士 - 博客园 (cnblogs.com)

标签:origin,Object,java,target,对象,object,Field,getClass,字段名
From: https://www.cnblogs.com/lastaz3/p/17501706.html

相关文章

  • java循环
    whilewhile(){}do{}while();for(;;){}增强for循环for(声明语句:表达式){}publicclasszqfor{  publicstaticvoidmain(String[]args){​    int[]a={10,20,30,40,50};    for(intx:a){      System.out.println(x);   ......
  • GIT保存记录原理之commit对象
    GIT中提交对象非常的重要,我们通过它记录代码提交过程、进行文件保存、回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的.git文件夹中。新建空项目```gitDemo```使用```gitinit```初始化,在文件夹根目录下会生成```.git```文件夹,文件夹中会......
  • OOP面向对象第三阶段学习总结
    OOP面向对象第三阶段学习总结目录 · 前言 · 设计与分析 · 踩坑心得 · 改进建议 · 总结 一、前言不知不觉OOP学习就已经来到了尾声,也即将要步入大二,回头望来,总总令人感慨。第三阶段的学习主要包括,一些set和map的用法。更加抽象点的提升呢,就是对自身对于......
  • [java学习] Spring的分页插件的使用
    概述:SSM集成常会使用到分页,Spring中提供了方便实用的分页插件  第一步:在Mybatis配置文件(SqlMapConfig.xml)中配置插件组件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://myb......
  • python入门(十):面向对象编程
    Python面向对象编程指南原文|大纲|首页在Python中,面向对象编程(Object-OrientedProgramming,简称OOP)是一种重要的编程范式。它允许我们通过创建对象、定义类和实现继承等概念来组织和管理代码。了解Python的面向对象编程对于编写可维护、可扩展和可重用的代码至关重要。......
  • Java 一维数组的使用
    Java一维数组的使用1.一维数组的定义在不知道数组内容可以直接使用下面的定义方法:int[]arr=newint[数组个数];或intarr[]=newint[数组个数];在知道数组内容可以使用如下:int[]arr={data1,data2,data.....};2.数组的传递数组的传递与其他基本类型的值传递不同,......
  • 通过内核调试查看当前的输入桌面对象
    通过本地内核调试或者用户双机调试查看当前的用户输入桌面在windbg中搜索win32kbase内核模块的导出符号,找到类似如下的符号xwin32kbase!*grpdeskRitInput*最终定位到的当前桌面对象名称为Default桌面0:kd>xwin32kbase!*grpdeskRitInput*fffff643`216d6c48win32kbase!grpd......
  • 浅谈OpenCV的多对象匹配图像的实现,以及如何匹配透明控件,不规则图像
    浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件引子OpenCV提供的templateMatch只负责将(相关性等)计算出来,并不会直接提供目标的对应坐标,一般来说我们直接遍历最高的相关度,就可以得到匹配度最高的坐标。但是这样一般只能得到一个坐标。在实际操作中,我们可能需要......
  • 55基于java的在线零食超市系统设计与实现
    本章节给大家带来一个基于java在线零食超市系统设计与实现,可适用于零食小吃,在线零食小吃超市,线上超市,线上零食商城,美食商城,美食超市,校园超市,零食资讯等等。引言随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中人们对交易平台方面的要求也在......
  • JAVA编程开发之 新蜂商城 --- 简介
    开源商城学习项目https://github.com/newbee-ltd/newbee-mallhttps://gitee.com/newbee-ltd/newbee-mallhttps://edu.csdn.net/course/detail/26258https://juejin.cn/book/6844733814074245133?suid=3808363978174302&source=pc新蜂商城虽然不能作为真实企业级项目,但是是优......