JACOCO가 가져온 필드 일치 문제

1779 단어
    /**
     *  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' 를 발견합니다.테스트 환경에 자코코코가 코드 커버율 통계를 넣었기 때문에 이런 영향이 있을지 모른다.이 컴파일러가 추가된 필드는 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;
    }

좋은 웹페이지 즐겨찾기