Jacoco 会利用编译器在编译期间加入 JacocoData成员变量,如果使用反射循环成员变量进而拼凑set或者get方法,会产生NoSuchMethodException,建议在循环中利用isSynthetic()方法检查成员变量。
Eclipse中的Coverage 插件是使用jacoco来统计单元测试的代码覆盖率,会在类中加入 JacocoData成员变量,会导致反射循环成员变量进而拼凑set或者get方法时抛出NoSuchMethodException。
for (Field f : obj.getClass().getDeclaredFields()) {
f.setAccessible(true);
String g = f.getName();
if (g.equals("serialVersionUID")) {
continue;
}
//过滤jacoco编译期间加入的 JacocoData 字段
if (f.isSynthetic()) {
continue;
}
if (f.get(obj) != null) {
flag = true;
return flag;
}
}