在接口中添加defaut方法时,我得到了不必要的方法$ jacocoInit。我的界面如下所示:
@Value.Immutable
public interface Customer {
Optional<@NotBlank String> name();
default Object getObject(final String abc) {
return null
}
default void getObject() {
}
}
我在做的时候
for (Method method : Customer.class.getDeclaredMethods()) {
System.out.println(method.getName());
}
然后,我得到
name
getObject
$jacocoInit
如果我从其中删除默认方法,则它不是$ jacocInit方法。我不确定为什么会这样吗?有人可以帮忙吗?
根据JaCoCo FAQ:
为了收集执行数据,JaCoCo会测试被测类,这将两个成员添加到类中:私有静态字段
$jacocoData
和私有静态方法$jacocoInit()
。这两个成员都标记为合成。请更改您的代码以忽略合成成员。无论如何,这都是一个好习惯,因为Java编译器还会在某些情况下创建综合成员。
Method isSynthetic
of class java.lang.reflect.Method
如果此可执行文件是合成结构,则返回true;否则,返回true。否则返回false。
因此要忽略合成成员:
isSynthetic
这是Java编译器创建合成方法的许多示例之一:
java.lang.reflect.Method
使用JDK for (Method method : Customer.class.getDeclaredMethods()) {
if (method.isSynthetic()) {
continue;
}
System.out.println(method.getName());
}
执行
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();
}
}
}
生产
1.8.0_152
这里是javac Example.java
java Example
:
未出现在源代码中的类成员必须使用Synthetic属性进行标记,[...]
您可以在name: m
isSynthetic: false
name: lambda$static$0
isSynthetic: true
和Java Virtual Machine Specification states about synthetic members中阅读有关JaCoCo实现的更多信息,其中还包括其他一些合成构造的示例。