关于 $jacocoData遇到的坑

笑着哭i 提交于 2019-12-15 03:35:33

项目中使用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;
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!