当前位置: 首页 > 知识库问答 >
问题:

当Execute jacoco prepare agent时,使用反射捕获Java注释将不起作用

秦博达
2023-03-14

我有一个多模块maven项目。这是jaxb使用xsd生成的一组类。下面给出了此类类别的示例。(无getter和setter)

@XmlRootElement(name = "IPPAMUser")
public class IPPAMUser {

@XmlElement(name = "UserName", required = true)
protected String userName;
@XmlElement(name = "PAMInstanceID", required = true)
protected String pamInstanceID;
@XmlElement(name = "Product", required = true)
protected String product;
@XmlElement(name = "Password", required = true)
protected String password;
@XmlElement(name = "PasswordAlogo", required = true)
protected String passwordAlogo;
@XmlElement(name = "LastUpdatedOn", required = true)
protected String lastUpdatedOn;
@XmlElement(name = "IsGenerated")
protected boolean isGenerated;
@XmlElement(name = "LastNotifiedOn", required = true)
protected String lastNotifiedOn;
}

一个模块需要它们作为键值对。因此,有一个方法编写了反射,将它们转换为键值对列表。在这种情况下,字段的名称用作键,值用作其值。如下所示。

Field[] fields = t.getClass().getDeclaredFields();
    for(Field field : fields) {
        Annotation anotation = field.getAnnotation(XmlElement.class);
        XmlElement xmlElement = (XmlElement) anotation;

        String methodName;
        String parameterValue = "";
        if(field.getType() == boolean.class){
            methodName = "is" + xmlElement.name();
        } else {
            methodName = "get" + xmlElement.name();
        }
        try {
            Method method = t.getClass().getDeclaredMethod(methodName);
            if(method.invoke(t) == null){
                continue;
            }
            parameterValue = method.invoke(t).toString();
        } catch (NoSuchMethodException e) {
            log.error("Method not found. Method : " + methodName, e);
            log.error("Stack trace : {}", AuthUtils.getPrintableStackTrace(e));
        } catch (InvocationTargetException e) {
            log.error("Method invoking failed. Method : " + methodName, e);
            log.error("Stack trace : {}", AuthUtils.getPrintableStackTrace(e));
        } catch (IllegalAccessException e) {
            log.error("Illegal access " + e);
            log.error("Stack trace : {}", AuthUtils.getPrintableStackTrace(e));
        }
  }

有一些使用这种转换的测试用例。它们工作正常,并使用maven构建执行。为了获得代码覆盖率,添加了Jacoco-maven-plugin。运行时不会生成jacoco.exec文件。根据此后执行目标被添加到我的pom文件中。之后,我的单元测试失败,给出空指针异常。根据堆栈跟踪,它是在执行“xmlElement.name()”时引起的,这意味着xmlElement为空。因此,在添加执行目标后,反射无法获得注释。

如何使用jacoco或任何其他方法解决此问题并获取代码覆盖率报告。

提前谢谢。

共有1个答案

荀子轩
2023-03-14

我自己想出解决方案。当Jacoco准备代理时,它会将一些合成字段包含到类中。因此,当它试图获取它时,没有所需注释的合成字段会包含在字段列表中。

作为反射中的最佳实践,请检查您访问的每个字段的isSynthy()。这将避免您访问编译器添加的字段以及Jacoco等工具。有关更多参考资料,请参阅这些链接。

合成场地Jacoco合成场地

 类似资料:
  • 问题内容: 我正在尝试使用Java批注,但似乎无法使我的代码认识到其中存在。我究竟做错了什么? 问题答案: 您需要使用注释界面上的@Retention注释将注释指定为运行时注释。 即

  • 当我在spring aop拦截类上使用注释时,我使用了@target limit匹配方法。但调试时,会提示以下错误。 我的切入点是这样的 其中TimeIt是注释: 我把切点改成能跑了 我不太理解的是,MetricsFilter 类没有这个注释,那么为什么要生成代理呢?任何人都可以帮我吗?谢谢。

  • 但是,由于某种原因,总是,所以我不确定这是注释类的问题还是我使用反射的方式的问题。我很确定是后者,因为在调试时,我发现它能够访问带有注释的方法。如有任何帮助,不胜感激,谢谢!

  • 我有一个简单的类叫BeaconDao 然而,当我用@service或@component标记beaconDao时,一切都运行得非常好。有人能看出问题所在吗?

  • 问题内容: 我知道有一些关于此的帖子,但是它们大约一年了,没有任何回应。实际上,我们在PostgreSQL 8.4上使用的是Hibernate 4.2.1.Final。我们有两个这样的实体 实体A(顶级层次结构类) 实体B(子类) 如您所见,使用注释了一个实体,但是当使用来获取顶级类时 我们也通过属性获得了B子类。实际上,SQL语句包含。这仍然是Hibernate第四版中的错误,还是我做错了什么?

  • 问题内容: 我从Spring Framework开始,想做一个带有注释的HelloWorld,我已经创建了一个控制器和一个视图,我猜它是基本的hello工作。但是,我想使用注释,因为我不能再使用SimpleFormController(已弃用)。 我收到的错误是Estado HTTP 404-/av/index.jsp 我正在使用Netbeans,并将示例基于它提供的基本模板。我有以下文件,我可以