Синтетические поля в Java

Некоторые утилиты, работающие с Java, могут создавать свои собственные поля, в которых будут хранить дополнительную информацию. Например, библиотека подсчёта покрытия кода тестами JaCoCo Java Code Coverage Library добавляет в каждый класс поле $jacocoData.

Если ваш код, например в тестах, перебирает все поля класса через Java Reflection API, то он тоже увидит это поле. Причём, он его увидит только в том случае, если подсчёт покрытия кода тестами включён. При обычном запуске теста этого поля не будет. При запуске с покрытием в таком случае вы можете видеть ошибку вида:

А это значит, что ваш код должен каким-то образом игнорировать это искусственно добавленное синтетическое поле, а также все остальные синтетические поля, которые могут быть добавлены другими утилитами. Как это сделать? Каждый раз, когда мы получаем список полей класса через Reflection API мы должны фильтровать его, убирая все поля, которые начинаются с символов подчёркивания и доллара (смотрите правила именования в Java). Получить список таких полей для класса можно с помощью следующего кода:

В этом коде мы задействовали Apache Commons Lang, который, скорее всего, всё равно уже будет подключён к вашему проекту, так как он очень сильно распространён. А также мы использует Java Stream API для фильтрации списка полей класса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *