Estoy recibiendo un método innecesaria $ jacocoInit al añadir el método defaut en la interfaz. Mi interfaz se parece a esto:
@Value.Immutable
public interface Customer {
Optional<@NotBlank String> name();
default Object getObject(final String abc) {
return null
}
default void getObject() {
}
}
Cuando estoy haciendo
for (Method method : Customer.class.getDeclaredMethods()) {
System.out.println(method.getName());
}
entonces, me estoy haciendo
name
getObject
$jacocoInit
Si quito el método por defecto de ella, entonces no hace $ jacocInit método. No estoy seguro de por qué está sucediendo? Por favor alguien puede ayudar en esto?
De acuerdo con JaCoCo FAQ :
Para los instrumentos de ejecución de datos JaCoCo cobrar las clases bajo prueba que se suma a dos miembros de las clases: Un campo estático privada
$jacocoData
y un método estático privada$jacocoInit()
. Ambos miembros están marcados como sintético.Por favor, cambiar el código para ignorar los miembros sintéticos. Esta es una práctica buena de todos modos como también el compilador Java crea miembros sintéticos en cierta situación.
Método isSynthetic
de la clasejava.lang.reflect.Method
Devuelve true si este ejecutable es una construcción sintética; devuelve false en caso contrario.
Así que hacer caso omiso de los miembros de síntesis:
for (Method method : Customer.class.getDeclaredMethods()) {
if (method.isSynthetic()) {
continue;
}
System.out.println(method.getName());
}
Y aquí es uno de los muchos ejemplos en los que el compilador Java crea método sintético:
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();
}
}
}
El uso de JDK 1.8.0_152
ejecución de
javac Example.java
java Example
produce
name: m
isSynthetic: false
name: lambda$static$0
isSynthetic: true
Y aquí es lo que Java Virtual Machine especificación establece sobre los miembros de síntesis :
Un miembro de la clase que no aparece en el código fuente deberá ser marcado con un atributo sintético, [...]
Puede leer más sobre la implementación JaCoCo en su documentación y en las presentaciones realizadas por el equipo de JaCoCo , que también incluyen otros ejemplos de construcciones sintéticas.