反射--①

本文介绍了一个Java方法,用于从两个实体类(SrSupplierChangePage和SrSupplier)中提取不同字段的值,通过反射和维表映射进行中英文名称转换,并将差异信息存储在SrSupChangeRemark列表中。
摘要由CSDN通过智能技术生成
public List<SrSupChangeRemark> getBasciInformation(SrSupplierChangePage srSupplierChangePage,List<SrSupChangeRemark> differencesList) {
        String supplierId = srSupplierChangePage.getSupplierId();
        SrSupplier srSupplier = srSupplierService.getById(supplierId);
        Field[] fields = SrSupplierChangePage.class.getDeclaredFields();
        Field[] fields1 = SrSupplier.class.getDeclaredFields();
        //单独做了一张维表sr_sup_change_comparative_reference取中英文对照,放到循环外
        List<SrSupChangeComparativeReference> references = srSupplierService.getName();
        Map<String,String> referenceMap = new HashMap<>();
        for (SrSupChangeComparativeReference reference:references){
            referenceMap.put(reference.getEnglishName(), reference.getChineseName());
        }

        for (Field field : fields) {
            for (Field field1 : fields1) {
                if (field.getName().equals(field1.getName())) {
                    field.setAccessible(true); // 设置字段可访问,即使是私有字段
                    field1.setAccessible(true);
                    try {
                        //对比两个类的字段是否相同,不只判断名称
                        Field correspondingField = getFieldByName(srSupplier.getClass(), field.getName());

                        if (correspondingField != null) {
                            Object value1 = field.get(srSupplierChangePage);
                            Object value2 = field1.get(srSupplier);
                            if(value2 instanceof BigDecimal){
                                BigDecimal valueBigDecimal = (BigDecimal) value2;
                                value2 = valueBigDecimal.stripTrailingZeros().toPlainString();//toPlainString取消科学计数法,stripTrailingZeros去0
                            }
                            // 比较字段值是否相同
                            if (value1 != null&& !value1.toString().equals(value2==null?"":value2.toString())) {
                                SrSupChangeRemark changeRemark = new SrSupChangeRemark();
                                changeRemark.setChangeContent(referenceMap.get(field.getName()));
                                changeRemark.setId(supplierId);
                                changeRemark.setAfterChange(String.valueOf(value1==null?"":value1.toString()));
                                changeRemark.setBeforeChange(String.valueOf(value2==null?"":value2.toString()));
                                differencesList.add(changeRemark);
                            }
                        }
                    } catch (IllegalAccessException e) {
                        // 处理异常,例如记录日志
                        e.printStackTrace();
                    }
                }
            }
        }
        return differencesList;
    }

以上述代码为例,步骤如下:

1.通过getDeclaredFields方法获取类中的变量名,变量类型

2.这个案例中主要是对两个实体中的变量个数以及变量名进行对比,将其中不同的放到differencesList

3.这个案例中在setChangeContent的时候由于需要取中文名,而反射后的字段是定义在实体中的声明变量,都是英文。所以做了一张维表进行中英对照。而为了提升效率把对于表的查询操作放到了for循环外,然后放到Map中再进行get,减少表的操作。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值