JACOCO带来的符合字段问题

    /**
     * 判断是否对象所有属性都为null, 或空字符串(继承的属性不考虑在内)
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public static boolean isAllPropEmpty(Object obj) throws IllegalAccessException {
        Field[] declaredFields = obj.getClass().getDeclaredFields();
        for (Field declaredField : declaredFields) {

            declaredField.setAccessible(true);
            Object value = declaredField.get(obj);

            if (value != null){
                if (! (value instanceof  String)){
                    return false;
                }else if(!((String) value).matches("^\\s*$")){
                    return false;
                }

            }
        }
        return true;
    }

如图方法,在测试环境发现无法准确工作;通过日志输出发现有个奇怪的字段“$jacocoData”;
因为测试环境加入了jacoco做代码覆盖率统计,但是不知道会有这种影响;对于这种编译器加入的字段,可以通过isSynthetic来判断,所以,原有方法可以修改为:

    /**
     * 判断是否对象所有属性都为null, 或空字符串(继承的属性不考虑在内)
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public static boolean isAllPropEmpty(Object obj) throws IllegalAccessException {
        Field[] declaredFields = obj.getClass().getDeclaredFields();
        for (Field declaredField : declaredFields) {

            if (declaredField.isSynthetic()){
                //针对某些情况,编译器会引入一些字段,需要过滤掉
                continue;
            }
            declaredField.setAccessible(true);
            Object value = declaredField.get(obj);

            if (value != null){
                if (! (value instanceof  String)){
                    return false;
                }else if(!((String) value).matches("^\\s*$")){
                    return false;
                }

            }
        }
        return true;
    }

你可能感兴趣的:(JACOCO带来的符合字段问题)