反射出现$jacocoData——Jacoco导致的Java反射pojo类属性问题

问题描述:

使用反射时结果出现$jacocoData相关信息,部分场景下可能出现问题 。

场景:

使用 反射 将pojo类的属性反射后拼接http get请求,

class WebReq{
     String param1;
     String param2;
   }

拼接成 http://web/api/detail?param1="xx"&param2="xx", 发送get请求时,如果当前环境集成了Jacoco(一般是测试环境,线上环境会考虑效率问题)可能出现实际链接为:

http://web/api/detail?param1="xx"&param2="xx"&$jacocoData=[Z@5614d170 的情况;

原因

如果当前部署环境集成了jacoco,jacoco会默认增强每个类(覆盖率需要),操作就是在类里加入一个Synthetic类型的$jacocoData。

实际不仅是jacoco,各种apm的agent(阿里云的arms,arthas等) 都是字节码增强,会改变class文件

故出现类似问题,可以优先看下是不是jacoco + 反射的问题;

解决办法

  1. 反射遍历类属性时,加入 if (field.isSynthetic()) { continue; };

    这条会跳过Synthetic类型字段

  2. 修改代码,慎用反射;

参考:

1.https://www.eclemma.org/jacoco/trunk/doc/faq.html;--My code uses reflection. Why does it fail when I execute it with JaCoCo?

2.https://github.com/jacoco/jacoco/issues/168

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。