关于 $jacocoData遇到的坑

项目中使用excel 解析jar包 需要判断每行读取的对象是否每个字段都为空

    private boolean isAllFieldNull(Object obj) throws IllegalAccessException {
        Class stuCla = obj.getClass();// 得到类对象
        Field[] fs = stuCla.getDeclaredFields();//得到属性集合
        boolean flag = true;
        for (Field f : fs) {//遍历属性
            f.setAccessible(true); // 设置属性是可以访问的(私有的也可以)
            Object val = f.get(obj);// 得到此属性的值
            log.info("isAllFieldNull name:{}, val:{}", f.getName(),  val);
            if(val != null) {//只要有1个属性不为空,那么就不是所有的属性值都为空
                flag = false;
                break;
            }
        }
        return flag;
    }

本地运行没有任何问题,用Jenkins 部署的测试环境就会判断空行也不为空,百思不得其解,只能多打印点日志:

红框的部分不为空
本地执行不会有这个属性。

总结一下

为了收集执行数据JaCo​​Co仪器下的测试,增加了两个成员的类的类:专用静态字段$ jacocoData和私人静态方法$ jacocoInit()。这两个成员都被标记为合成的。 请更改您的代码以忽略合成成员。无论如何,这是一个很好的做法,因为Java编译器在某些情况下创建合成成员。

增加一段判断是否为原生字段

private boolean isAllFieldNull(Object obj) throws IllegalAccessException {
        Class stuCla = obj.getClass();// 得到类对象
        Field[] fs = stuCla.getDeclaredFields();//得到属性集合
        boolean flag = true;
        for (Field f : fs) {//遍历属性
            f.setAccessible(true); // 设置属性是可以访问的(私有的也可以)
            Object val = f.get(obj);// 得到此属性的值
            log.info("isAllFieldNull name:{}, val:{}", f.getName(),  val);
            // f.isSynthetic() 处理非原生字段 针对 $jacocoData合成字段
            if(!f.isSynthetic() && val != null) {//只要有1个属性不为空,那么就不是所有的属性值都为空
                flag = false;
                break;
            }
        }
        return flag;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值