项目开发中遇到了一个问题,类中出现未知属性 ‘ $jacocoData ’,准确的来说,实际上在集成测试阶段,系统自动运行测试用例时,抛出来的异常提示信息,但是在开发阶段是不存在的。这个问题是以前没有遇到过的一中bug,因此在此处记录并分析。

 (与本片无关,介意者忽略)

  先在这儿介绍一下目前项目的开发模式,使用的是迭代式开发。(参考百度)

  1.瀑布式开发: 瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求、分析、设计、编码、代码审阅、测试、维护的步骤顺序进行。

            适用:系统目标需求明确,时间固定,

  2.敏捷式开发:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。敏捷式开发是一种开发方法。

           适用:以用户为导性,快速开发,验证,修正的一种开发方式。

  3. 迭代式开发:在迭代开发中,整个开发工作被组织为一系列的短小的、固定长度(如3周)的小项目,被称为一系列的迭代,这叫迭代开发。

                 每一次迭代都包括了定义、需求分析、设计、实现与测试。迭代式开发是一种开发过程。

         适用:需求不明确,持续进行变更的项目,可以降低风险,提高复用性。

  目前fn先生所开发项目的相关步骤:

    1. 任务需求:由PD产出需求,分析之后,明确本次迭代的checkList;

    2. 文档编写:由开发/测试共同编写,其中需求背景,开发思路,系统交互,接口文档,测试场景,上线时间,人员排期及FAQ等;

    3. 项目阶段:开发阶段 -> 集成测试 -> 预发灰度 ->项目上线;

      注:在开发完成时,需要有交付报告产出,表明本次开发的影响点,风险点,上线时间,jar发布版本,系统间交互影响,是否可回滚等等;

    4. 下个需求:哎,惆怅,轮番轰炸呐!!!头发都快成C字型了。

 (正文)

  如题,所遇到的情况是:

    类说明:继承多层级的抽象类,其下有多个子类,其中有一type属性对应该类的类型,还有一个属性properties对应不同的数据类型,及自定义的数据解析动作;

    场景说明:获取数据集合后,可以得到每个element的type,但是具体的properties的属性还需要进行再次处理,所以这儿如何拿到每个element对应的具体类型,就是处理的关键。

    

  在处理上述情况时,想到两种处理方式

    1. 根据type创建一个Enum类,存储type对应的class,并初始化一个实例,再进行具体处理;

    2. 根据type利用反射技术,重新创建一个对象,将其赋原始值后,再进行其具体类的指定处理动作;(本文只记录分析bug,不讲解反射)

  

  当时没有想太多,采用的是第二种方式处理,利用反射(reflect)进行不同类的针对性处理。

    1. 遍历获取的抽象类的集合信息,获得element;

    2. 判断其具体type,进行实例化新的对象(newInstance),获得该类,包含其父类所有的属性(注意此处);

    3. 利用反射进行对新实例对象的赋值( field.set( newInstance,value ) 注意此处),之后进行具体的处理动作,如调用properties的解析函数...等;

  上面的步骤在dev环境下,所有执行操作都是OK的,但是在集成测试阶段时,测试用例自动执行时,抛出【Method not found : $jacocoData】。

  排查之后,发现是集成测试环境下,通过反射获取数据时,多出两个属性, $jacocoData   ...(呃,那个属性忘了),这两个属性通过反射赋值时,就会抛出如上异常。

  但是为什么会出现上面的多余属性呢

    因为在集成测试阶段,测试用例执行的时候,maven集成了Jacoco来统计单元测试的代码覆盖率,而dev环境没有作相应的配置。

    Jacoco 会利用编译器在编译期间加入 $jacocoData 成员变量,Jacoco使用 asm 实现字节码植入,是对指令级别上的字节码植入,从而可以定位到执行的代码行。

  

  asm是什么?(CSDN)

    ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。

    ASM是一款操作class文件流的工具类,效率大大高于普通Java代码编译成class的方式。操作class流的方式其实就是通过手动操作jvm的指令集,来生成或修改class文件流。众所周知普通Java代码通过javac编译生成class文件后,再通过javap -v 即可查看反编译的类似汇编代码。而asm的实现方式就是完成这样的汇编代码。

   

  如何解决该问题 ?(CSDN)

    在反射遍历字段的时候,可以对字段进行判断看是否是复合字段,假如是复合字段就跳出,具体函数是:field.isSynthetic() 为true证明是复合字段,continue;

     注:synthetic总的来说,是由编译器引入的字段、方法、类或其他结构,主要用于JVM内部使用,为了遵循某些规范而作的一些小技巧从而绕过这些规范,有点作弊的感觉,只不过是由编译器光明正大的,人为是没有权限的(但事实上有时候还是能被利用到的)。

  

  -_- 汗~~

  查询之后,虽然也是一知半解,但是程序运行时,抛的异常是可以先解决了,重新提交代码合并...............走你...........................

  参考文档链接:

    https://blog.csdn.net/shawn_ling/article/details/81205705

    https://blog.csdn.net/samyang1/article/details/79853270

    https://blog.csdn.net/kifgep/article/details/82757417

项目开发bug记录的更多相关文章

  1. 读《31天学会CRM项目开发》记录2 - 企业信息管理系统

    在信息技术的快速推动下,企业如果依然利用传统的管理方式,以人为主,那效率便会大打折扣.在此背景下,企业信息化系统得 到了高速发展.如我们常见的ERP系统.MES系统,都是提高公司运行效率,降低运营以及 ...

  2. 读《31天学会CRM项目开发》记录1 - 认识软件开发

    今天闲来无事,心中又对软件开发充满了向往和憧憬.一直认为实践是检验真知的唯一标准,也是快速提升的绝密方法,是巩固基础加深基础的好去处.故在JD上搜了下软件开发,看到了这本<31天学会CRM项目开 ...

  3. 读《31天学会CRM项目开发》记录4 - WEB服务配置

    好几天没有更新记录了,因为最近都在看本书的基础内容,然后跟着练习.等看到数据库部分,就晕菜了,只能草草浏览一遍,想在后面的实战中再加强. 下面是对IIS 和ASP.NET的配置! 一.什么是IIS? ...

  4. 读《31天学会CRM项目开发》记录3 - CRM解决方案

    一. 二.CRM系统设计方案 CRM技术部分设计方案主要包括:服务器端设计方案.客户端设计方案.数据库设计方案.应用系统框架设计方案. 1.服务器端设计方案 配备平台:IIS7和SQL Server2 ...

  5. 使用digitalocean进行项目开发

    使用digitalocean进行项目开发 命令记录 搭建SS 1 apt-get update 2 apt-get install python-pip 3 pip install --upgrade ...

  6. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

  7. TMS320F28335项目开发记录1_CCS的使用介绍

    CCS使用介绍 一.前言 本系列文章记录本人实际项目开发时对ti的DSP28335,以及CCS开发环境等的学习与记录,相对于2812来说,28335的资料还是比較少的,只是原理是相通的,28335说白 ...

  8. Unity3D Demo项目开发记录

    前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...

  9. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

随机推荐

  1. LAMP 1.8默认虚拟主机

    默认虚拟主机是为了解决别人域名恶心绑定自己的服务器ip,可导致服务器上的网站排名靠后,即干扰seo优化 我们访问指定的两个网站可以直接访问,ip也可以访问 打开配置文件 vim /usr/local/ ...

  2. python 使用sqlite3

    Sqlite是一个轻量级的数据库,类似于Access. 一. 安装 Python 2.5开始提供了对sqlite的支持,带有sqlite3库. 没有sqlite的版本需要去PySqlite主页上下载安 ...

  3. [poj3259]Wormholes(spfa判负环)

    题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环.  两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...

  4. 2、misa统计SRR结果

    参考: https://www.sogou.com/link?url=hedJjaC291NYNxVe4xgB4c3bUxXRMqZrT93cntTAgYfyBbRAdP9kIA.. https:// ...

  5. 6.【应急响应】Linux入侵排查思路

    0x01 入侵排查思路 一.账号安全 基本使用: 1.用户信息文件/etc/passwd root:x:0:0:root:/root:/bin/bash account:password:UID:GI ...

  6. 28.【转载】挖洞技巧:APP手势密码绕过思路总结

    说到APP手势密码绕过的问题,大家可能有些从来没接触过,或者接触过,但是思路也就停留在那几个点上,这里我总结了我这1年来白帽子生涯当中所挖掘的关于这方面的思路,有些是网上已经有的,有些是我自己不断摸索 ...

  7. 【linux学习-centeros】

    1:linux的目录结构: / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ftp — 用户所有服务 httpd sa ...

  8. JS中的for....in循环 和 for ...of循环以及iterable遍历Map和Set

    for循环的一个变体是for ... in循环,它可以把一个对象的所有属性依次循环出来: var o = { name: 'Jack', age: 20, city: 'Beijing' }; for ...

  9. bzoj 3944: Sum(杜教筛)

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4930  Solved: 1313[Submit][Status][Discuss ...

  10. 洛谷P1038 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...