Проблема с моим проектом в том, что функция getDeclareFields возвращает $ jacocoData? - PullRequest
0 голосов
/ 29 ноября 2018

код:

Field[] fields = obj.getClass().getDeclaredFields();

obj - это класс, который имеет 2 поля.

public class NullInfo implements Data {

    @Idx(0)
    private Integer index;

    @Idx(1)
    private String  fieldName;
}

интерфейс Данные пусты.

Моя проблема: Длина поляожидается, что будет только 2. См. скриншот

Что такое $ jacocoData?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я полагаю, что проблема возникает, когда вы запускаете покрытие кода с помощью Jacoco.

Основная причина:

jacoco добавит статическое поле в ваш класс по причине@ Годин объяснил.

Решение:

вам нужно использовать отражение Java только на «исходных» полях.Вы можете либо явно исключить поле с именем $ jacocoData, либо использовать аннотацию в качестве фильтра, например, g.

Field field = fields[i];
Idx annotation = field.getAnnotation(Idx.class);
if (annotation == null) {
    continue;
}
0 голосов
/ 01 декабря 2018

что такое $jacocoData?

цитирование JaCoCo FAQ :

В моем коде используется отражение.Почему происходит сбой при выполнении с помощью JaCoCo?

Для сбора данных выполнения JaCoCo анализирует тестируемые классы, которые добавляют к классам два члена: личное статическое поле $jacocoData и закрытый статический метод $jacocoInit(),Оба члена отмечены как синтетический .

Пожалуйста, измените свой код, чтобы игнорировать синтетические члены.В любом случае, это хорошая практика, так как компилятор Java создает искусственные элементы в определенной ситуации.

Метод https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#isSynthetic() позволяет определять искусственные поля.

...