【代码可视化实践】代码变更影响分析 | 京东云技术团队

京东云开发者
• 阅读 227

1.前言

笔者前文“浅析代码可视化”中讲述了代码可视化的基本实现原理,并给出了一些业界的应用场景。由于涉及原理和技术范围较广,以笔者能力难以做到面面俱到,为了减少信息传递偏差,便给出了一些信息来源供读者深入阅读。不过针对文中提到应用场景中的一些小的功能点,可以拿出来详尽的分析一下实现方案,以小见大。因此本文将针对代码可视化在代码变更影响分析上的应用做较详细的阐述,希望能对大家有所帮助。

2.场景

先用2个常见的开发场景来还原描述为什么我们需要“代码变更影响分析”。

场景1:修改了方法①逻辑,以为只会影响入口A便只回归了相关的场景,上线后发现影响了入口B的逻辑,造成了线上事故;

【代码可视化实践】代码变更影响分析 | 京东云技术团队

场景2:修改了方法②逻辑,并回归了所有已知的流量入口,但上线一段时间后出现了大量异常告警,原来是影响了定时任务和MQ消费逻辑;

【代码可视化实践】代码变更影响分析 | 京东云技术团队

其他等等......

“代码变更影响分析”具体的可以描述为:如何感知代码改动造成功能逻辑变化的影响范围,具体到影响了哪些类、方法、入口以及调用拓扑。

3.方案

针对需求,下面给出一种基于源码静态分析的实现方案。

【代码可视化实践】代码变更影响分析 | 京东云技术团队

4.实现

下面阐述基于Java8的具体实现方案

4.1 方法调用拓扑生成

  • 基本思路

使用JGit拉取远程仓库到本地后使用JavaParser对源码进行分析,从而得到类、方法和方法调用信息,基于此构建方法调用拓扑图。

  • 实现步骤

步骤一:使用JGit将远程仓库拉取到本地

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤二:设置JavaParser配置并解析项目所有源码文件

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤三:遍历所有类文件获取类、方法和方法调用信息

【代码可视化实践】代码变更影响分析 | 京东云技术团队

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤四:识别项目入口类和方法(示例代码仅实现了spring http入口识别)

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤五:将入口方法作为起始节点,基于方法和调用关系生成方法调用拓扑图

(用来解析的代码示例在src/main/java/com/analysis/code/example包下)

【代码可视化实践】代码变更影响分析 | 京东云技术团队

4.2 代码变更影响分析

  • 基本思路

通过Git Diff获取变更影响了哪些Java类文件,然后对变更前后的类文件进行源码解析得到类方法列表并对比前后差异得到变更影响的方法节点,最后结合之前生成的方法拓扑信息得到变更影响拓扑图。

  • 实现步骤

步骤一:使用JGit获取分支变更影响了哪些文件

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤二:使用JavaParser对变更前后的Java文件进行解析,获取变更前后类的方法列表

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤三:依次对照变更前后方法体信息(去除了注释影响,并格式化了代码),得到变更影响了哪些方法

【代码可视化实践】代码变更影响分析 | 京东云技术团队

步骤四:结合方法拓扑生成变更影响结果

【代码可视化实践】代码变更影响分析 | 京东云技术团队

5.总结

越早评估出改动的影响面将更容易把风险扼杀在摇篮里,以更小的成本避免事故的发生。本文提供了一种"代码变更影响分析"功能的粗粒度实现方案,综合运用了Git、源码分析、可视化图表等技术。不过针对愈发复杂的业务现状,文中描述的功能还比较初级,还需要按场景进行针对性的增强和细化,从而真正做到对开发者有帮助。

6.参考

JavaParser

JGit-CookBook

Graphviz

Graphviz-Java

作者:京东科技 谢骁

来源:京东云开发者社区 转载请注明来源

点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
3年前
canvas图像识取技术以及智能化思考
笔者最近一直在研究前端可视化和搭建化的技术,最近也遇到一个非常有意思的课题,就是基于设计稿自动提取图片信息,来智能化出码.当然本文并不会介绍很多晦涩难懂的技术概念,我会从几个实际应用场景出发,介绍如何通过canvas图像识取技术来实现一些有意思的功能.最后会总结一些对智能化的思考以及对低代码方向的规划,希望能对各位有所启发.canv
Wesley13 Wesley13
3年前
UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)
0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We
如何让Java编译器帮你写代码
本文结合京东监控埋点场景,对解决样板代码的技术选型方案进行分析,给出最终解决方案后,结合理论和实践进一步展开。通过关注文中的技术分析过程和技术场景,读者可收获一种样板代码思想过程和解决思路,并对Java编译器底层有初步了解。
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Linux应急响应(四):盖茨木马
0x00前言Linux盖茨木马是一类有着丰富历史,隐藏手法巧妙,网络攻击行为显著的DDoS木马,主要恶意特点是具备了后门程序,DDoS攻击的能力,并且会替换常用的系统文件进行伪装。木马得名于其在变量函数的命名中,大量使用Gates这个单词。分析和清除盖茨木马的过程,可以发现有很多值得去学习和借鉴的地方。0x01应急场景
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
6个月前
实现“代码可视化”需要了解的前置知识-编译器前端
1.前言“代码可视化”的概念定义和业界案例在前文中已经进行了讲述,综述可阅读,更多相关知识可查看专栏“”。本文梳理了“代码可视化”功能开发需要前置了解的编译器前端部分知识,因能力有限若有解释不清和错误的地方敬请谅解,如果想更深入正规的学习相关知识可以查看文