Java医生
本系列记录常见Bug,以及诊断过程和原因
作者:Java医生
V:study_51ctofx
一、关于错误信息
问题起因是Uat环境反馈生成txt文件少了一列,当时少了PHONE_NO字段
根据问题反馈,首先在Beta上进行问题复现,发现并没有发生此问题,PHONE_NO字段正常显示
思路1: 排查代码是否是最新的,是否被发生修改
最终发现发布的代码完全一致,没有发生任何修改,这就有点奇怪,随后进行代码debug排查,根据生成列的逻辑判断,试图发现有可能产生的问题
思路2: 初步判断是此处产生的问题,进行debug测试
我们的逻辑是根据JavaBean进行反射字段名,来解析文件的列名,这里的Header就是根据列名,先计算出一个存储header的数组长度,问题的关键点就在这里
beta和uat两个环境通过对比发现,beta环境在反射的时候多了一个jacocoData字段,
此时可以看到这里的length -1 的操作,在默认beta环境的时候-1之后,长度正好和原生列名一致,因为多了一个jaccooData字段
相反uat环境没有jaccooData字段,减去长度-1之后,导致长度不匹配,从而出现列名少了一列的问题
问题的原因:beta环境使用了jaccoo工具
百度了下是做代码覆盖率测试的,总之是因为他在原生的代码中进行了字节码修改,新增了jaccooData字段
二、如何解决问题
解决方式:使用isSynthetic()过滤掉非原生的字段
Java题库在线答题:www.51ctofx.com