Согласно Часто задаваемым вопросам JaCoCo :
Для сбора данных выполнения JaCoCo анализирует тестируемые классы, которые добавляют в класс двух членов: личное статическое поле $jacocoData
иприватный статический метод $jacocoInit()
.Оба участника помечены как синтетические.
Пожалуйста, измените код, чтобы игнорировать синтетические члены.В любом случае, это хорошая практика, так как компилятор Java создает искусственные члены в определенной ситуации.
Метод isSynthetic
класса java.lang.reflect.Method
Возвращает true, если этот исполняемый файл является синтетической конструкцией;в противном случае возвращает false.
Таким образом, чтобы игнорировать искусственные члены:
for (Method method : Customer.class.getDeclaredMethods()) {
if (method.isSynthetic()) {
continue;
}
System.out.println(method.getName());
}
И вот один из многих примеров, когда компилятор Java создает синтетический метод:
import java.lang.reflect.*;
class Example {
interface I {
Runnable r = () -> {}; // lambda
void m();
}
public static void main(String[] args) {
for (Method method : I.class.getDeclaredMethods()) {
System.out.println("name: " + method.getName());
System.out.println("isSynthetic: " + method.isSynthetic());
System.out.println();
}
}
}
Использование JDK 1.8.0_152
выполнение
javac Example.java
java Example
производит
name: m
isSynthetic: false
name: lambda$static$0
isSynthetic: true
И вот что В спецификации Java Virtual Machine говорится о синтетических членах :
Член класса, который не отображается в исходном коде, должен быть помечен с использованием атрибута Synthetic, [...]
Подробнее о реализации JaCoCo можно прочитать в его документация и презентации, сделанные командой JaCoCo , которые также включают некоторые другие примеры синтетических конструкций.