问题描述:
使用反射时结果出现$jacocoData
相关信息,部分场景下可能出现问题 。
场景:
使用 反射 将pojo类的属性反射后拼接http get请求,
即
class WebReq{
String param1;
String param2;
}
拼接成 http://web/api/detail?param1="xx"¶m2="xx", 发送get请求时,如果当前环境集成了Jacoco(一般是测试环境,线上环境会考虑效率问题)可能出现实际链接为:
http://web/api/detail?param1="xx"¶m2="xx"&$jacocoData=[Z@5614d170 的情况;
原因
如果当前部署环境集成了jacoco,jacoco会默认增强每个类(覆盖率需要),操作就是在类里加入一个Synthetic类型的$jacocoData。
实际不仅是jacoco,各种apm的agent(阿里云的arms,arthas等) 都是字节码增强,会改变class文件
故出现类似问题,可以优先看下是不是jacoco + 反射的问题;
解决办法
-
反射遍历类属性时,加入 if (field.isSynthetic()) { continue; };
这条会跳过Synthetic类型字段
修改代码,慎用反射;
参考:
1.https://www.eclemma.org/jacoco/trunk/doc/faq.html;--My code uses reflection. Why does it fail when I execute it with JaCoCo?