インターフェイスに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よくある質問:
収集実行データJaCoCo機器へのクラスに2人のメンバーを追加し、テスト対象のクラス:プライベート静的フィールド
$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仮想マシン仕様は、合成メンバーについて述べています:
ソースコードに表示されていないクラスのメンバーが合成属性を使用してマークする必要があり、[...]
あなたにはJaCoCoの実装の詳細を読むことができ、そのマニュアルやでJaCoCoチームによって行われたプレゼンテーションも合成構造の他のいくつかの例を含みます、。