首页 > 其他分享 >反射的应用

反射的应用

时间:2024-09-07 15:25:40浏览次数:4  
标签:反射 子类 userBasicInfo field subEntity user 应用 import

 

import cn.iocoder.yudao.hospital.dal.dataobject.family_friends.HFamilyInfoIncremental;
import cn.iocoder.yudao.hospital.dal.dataobject.user.FoodAllergyIntoleranceIncremental;
import cn.iocoder.yudao.hospital.dal.dataobject.user.HBodyBasicInfo;
import cn.iocoder.yudao.hospital.dal.dataobject.user.HDailyActivities;
import cn.iocoder.yudao.hospital.service.family_friends.HFamilyInfoIncrementalService;
import cn.iocoder.yudao.hospital.service.user.FoodAllergyIntoleranceIncrementalService;
import cn.iocoder.yudao.hospital.service.user.HBodyBasicInfoService;
import cn.iocoder.yudao.hospital.service.user.HDailyActivitiesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.InvocationTargetException;

@Service
public class UserBasicInfoServiceImpl implements UserBasicInfoService {
    //活动兴趣和爱好
    @Autowired
    private HDailyActivitiesService hDailyActivitiesService;

    //身高和体重
    @Autowired
    private HBodyBasicInfoService bodyBasicInfoService;

    //家庭信息
    @Autowired
    private HFamilyInfoIncrementalService hFamilyInfoIncrementalService;

    //食品过敏史
    @Autowired
    private FoodAllergyIntoleranceIncrementalService foodAllergyService;


    /**
     * 新增用户的基本信息
     *
     * @param userBasicInfo 用户基本信息
     * @return
     */
    @Override
    public int insert(UserBasicInfo userBasicInfo) {
        int result = 0;
        //子实体类
        HBodyBasicInfo hBodyBasicInfo = new HBodyBasicInfo();
        //主类 属性赋值到对应的 子实体类的属性
        setSubEntityProperties(userBasicInfo, hBodyBasicInfo);
        if (hasNonCommonFields(hBodyBasicInfo)) {//判断子实体类,赋值是否成功
            //子实体类,添加一条记录
            result += bodyBasicInfoService.insertHBodyBasicInfo(hBodyBasicInfo);
        }

        HDailyActivities hDailyActivities = new HDailyActivities();
        setSubEntityProperties(userBasicInfo, hDailyActivities);
        if (hasNonCommonFields(hDailyActivities)) {
            result += hDailyActivitiesService.insertHDailyActivities(hDailyActivities);
        }

        HFamilyInfoIncremental hFamilyInfoIncremental = new HFamilyInfoIncremental();
        setSubEntityProperties(userBasicInfo, hFamilyInfoIncremental);
        if (hasNonCommonFields(hFamilyInfoIncremental)) {
            result += hFamilyInfoIncrementalService.insertHFamilyInfoIncremental(hFamilyInfoIncremental);
        }

        FoodAllergyIntoleranceIncremental allergyIntoleranceIncremental = new FoodAllergyIntoleranceIncremental();
        setSubEntityProperties(userBasicInfo, allergyIntoleranceIncremental);
        if (hasNonCommonFields(allergyIntoleranceIncremental)) {
            String str = foodAllergyService.createFoodAllergyIntoleranceIncremental(allergyIntoleranceIncremental);
            result += (str == null || str.equals("")) ? 0 : 1;
        }

        return result;
    }


    /**
     * 查询用户的基本信息
     *
     * @param userId
     * @return
     */
    @Override
    public UserBasicInfo selectByUserId(Long userId) {
        UserBasicInfo userBasicInfo = new UserBasicInfo();
        //查询子类信息
        HBodyBasicInfo hBodyBasicInfo = bodyBasicInfoService.selectHBodyBasicInfoByUserId(userId);
        //将子类查询到的信息,赋值给 主类
        userBasicInfo.setHBodyBasicInfo(hBodyBasicInfo);

        HDailyActivities hDailyActivities = hDailyActivitiesService.selectHDailyActivitiesByUserId(userId);
        userBasicInfo.setHDailyActivities(hDailyActivities);

        HFamilyInfoIncremental hFamilyInfoIncremental = hFamilyInfoIncrementalService.selectHFamilyInfoIncrementalByUserId(userId);
        userBasicInfo.setHFamilyInfoIncremental(hFamilyInfoIncremental);

        FoodAllergyIntoleranceIncremental foodAllergyIntoleranceIncremental = foodAllergyService.selectFoodAllergyByUserId(userId);
        userBasicInfo.setHFoodAllergyIntoleranceIncremental(foodAllergyIntoleranceIncremental);

        return userBasicInfo;
    }

    /**
     * 将主类的字段分发给子类
     *
     * @param user      主类
     * @param subEntity 子类
     */
    public void setSubEntityProperties(UserBasicInfo user, Object subEntity) {
        //获取子实体类的所有属性
        Field[] fields = subEntity.getClass().getDeclaredFields();
        for (Field field : fields) {
            //获取属性的名称
            String fieldName = field.getName();
            Object fieldValue = null;
            try {
                //获取fieldName对应在user类的get方法
                Method method = user.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
                fieldValue = method.invoke(user);
            } catch (NoSuchMethodException e) {
                //user类没有对应的get方法,可忽略

            } catch (InvocationTargetException | IllegalAccessException e) {
                throw new RuntimeException(e);
            }


            if (fieldValue != null) {
                field.setAccessible(true);
                try {
                    //给subEntity子类属性赋值
                    field.set(subEntity, fieldValue);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }

        }

    }

    /**
     * 判断子类中,除了5个共通字段其他字段是否有值
     *
     * @param subEntity 待检测的子类
     * @return 任意一个字段有值,则返回true,否则返回false
     */
    public Boolean hasNonCommonFields(Object subEntity) {
        Field[] fields = subEntity.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 排除共同字段
            if ("id".equals(field.getName()) ||
                    "userId".equals(field.getName()) ||
                    "recordDate".equals(field.getName()) ||
                    "createTime".equals(field.getName()) ||
                    "updateTime".equals(field.getName())) {
                continue;
            }

            field.setAccessible(true);
            try {
                Object value = field.get(subEntity);
                //检查子类属性值,任意属性值不为空,即返回true
                if (value != null && !"".equals(value)) {
                    return true;
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }

        return false;
    }
}

 

标签:反射,子类,userBasicInfo,field,subEntity,user,应用,import
From: https://www.cnblogs.com/jlcd/p/18401719

相关文章

  • 认识单片微型计算机和单片机应用
     单片微型计算机,简称单片机(SingleChipMicrocomputer或MicrocontrollerUnit,MCU),是一种将中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/O)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。以下是对单片微型计算机的详细认识:一、单片机的......
  • 事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire)
    原文:TransactionalOutboxin.NETCloudNativeDevelopmentviaAspire作者:OleksiiNikiforov总览这篇文章提供了使用Aspire、DotNetCore.CAP、AzureServiceBus、AzureSQL、Bicep和azd实现Outbox模式的示例。源代码:https://github.com/NikiforovAll/cap-aspire......
  • C#反射(Reflection)
    反射指程序可以访问,检测和修改它本身状态或行为的一种能力.程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集,模块和类型的对象.可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段......
  • [C++ Daily] 递归锁解决标准锁的典型应用
    递归锁解决标准锁的典型应用先看源码:结果(在A种尝试锁住mutex_时失败,进程等待,死锁无法退出:将std::mutex用std::recursive_mutex替换:结果:解析:std::recursive_mutex允许同一个线程对同一个锁对象进行多次上锁,获得多层所有权.......
  • Python复杂网络社区检测:并行谱聚类算法设计与多种算法应用实战研究
     分析师:LeiyunLiao在当今的网络科学领域,复杂网络中的社区检测成为了一个至关重要的研究课题。随着信息技术的飞速发展,各种大规模网络不断涌现,如社交网络、生物网络等。准确地识别这些网络中的社区结构,对于理解网络的功能、行为以及潜在的规律具有重大意义。网络社团划分算法作为......
  • [nacos] Nacos <3> 应用场景及高频问题(FAQ)
    场景:指定NACOS注册中心中springcloud微服务应用的IPspring:cloud:nacos:discovery:ip:127.0.0.1修改完成、并重启服务之后在nacos查看的地址如下:场景:curl请求NACOS常用功能接口测试版本nacos-client:2.0.3nacos-server:2.1.2推荐......
  • kubernetes 中 利用yaml文件部署应用
    目录1用yaml文件部署应用有以下优点1.1声明式配置:1.2灵活性和可扩展性:1.3与工具集成:2资源清单参数介绍2.1获得资源帮助指令explain2.2编写示例2.2.1示例1:运行简单的单个容器pod2.2.2 示例2:运行多个容器pod2.2.3示例3:理解pod间的网络整合2.2.4......
  • 研究离散数学在计算机技术中的应用
    一、研究背景  随着信息时代的到来,工业革命时代以微积分为代表的连续数学占主流的地位已经发生了变化,离散数学的重要性逐渐被人们认识。离散数学课程所传授的思想和方法,广泛地体现在计算机科学技术及相关专业的诸领域,从科学计算到信息处理,从理论计算机科学到计算机应用技术......
  • Python教程(二十一) : 从零开始制作计算器应用【PyQt6】
    文章目录专栏列表环境准备代码解析主要组件初始化界面布局设置事件处理计算逻辑运行应用完整代码示例截图总结注意专栏列表Python教程(十):面向对象编程(OOP)Python教程(十一):单元测试与异常捕获Python教程(十二):面向对象高级编程详解Python教程(十三):常用内置模块详解Python......
  • 【数据结构】顺序表的应用
    基于动态顺序表实现通讯录功能要求1)至少能够存储100个⼈的通讯信息2)能够保存用户信息:名字、性别、年龄、电话、地址等3)增加联系人信息4)删除指定联系人5)查找制定联系人6)修改指定联系人7)显示联系人信息SeqList.h#pragmaonce#define_CRT_SECURE_NO_WARNINGS#incl......