可视化 Java 项目

有一定规模的 IT 公司,只要几年,必然存在大量的代码,比如腾讯,2019 年一年增加 12.9 亿行代码,现在只会更多。不管是对于公司,还是对于个人,怎么低成本的了解这些代码的对应业务,所提供的能力,都是非常有必要的!

今天,阿七就带大家破解这个难题,根据这个文档,你能使用 AI 编程技术,根据包含 Java 完整代码的项目实现可视化下面三个方面的内容:

  • 模块和功能:应用内部的业务模块和功能,及相互间的关系,为用户提供应用的整体视图。
  • 类和接口:应用模块提供的业务能力以及对应的类和接口,以及接口对应业务流程语义化。
  • 方法实现语义化:方法实现逻辑的语义化和可视化;

一、先秀一下成果

一)Java 项目概览图

根据一个 Java 项目,可以生成下面这样的项目整体概览图,对于不需要了解实现细节的产品、运营同学,直接看这个图,就能够了解这个 Java 项目在干什么、能提供什么能力。

对于部分技术同学,不需要了解代码详情的,也可以直接看这个图即可。满足新入职同学对于接手不常变更项目的理解和全局业务的了解!

PS:由于保密需要,所有的成果图仅为示例图。实际的图会更好看、更震撼,因为一个 Java 项目的功能模块可能很多,提供的能力可能很多。

对于需要了解技术细节的同学,点击入口,能看到当前方法的流程图,快速了解当前方法提供的能力,具体的细节。还能迅速发现流程上可能存在的问题,快速纠正。

二)具体方法流程图

有了上面的两层可视化图表,不管是产品、技术、测试、运营以及小领导,都能快速的根据一个 Java 项目获取到他所需要的层级的信息,降低开发人员通过阅读代码梳理业务逻辑和代码逻辑的时间,尤其是新入职的同学。这个时间据统计,基本上在 25%-30%(百度、阿里等大公司调研数据更大,为 55%-60%),对于新同学,这个比例会更大!

二、实现步骤

一)整体概述图怎么生成?

一个 Java 项目所有对外接口在做的事情,就是一个 Java 项目的核心业务。这个对外接口包括:HTTP 接口、Dubbo 接口、定时任务。

1、获取一个 Java 项目所有对外接口

1)通过 Trace 平台

可以查询到一个 Java 项目所有对外的 HTTP 接口和 Dubbo 接口,通过注解可以查询一个 Java 项目所有定时任务。

优点:

  • 数据准确,跑出来的数据,一定是还在用的接口;
    缺点:
  • 需要依赖 Trace 平台数据,部分公司可能没有 Trace 平台。

2)通过 JavaParser 工具

可以通过 JavaParser 工具,扫描整个 Java 项目代码。找到所有的对外入口。

优点:

  • 不依赖 Trace 数据;
    缺点:
  • 可能不准确,因为有些接口已经不被使用了。
2、获取对外接口的方法内容

1)根据 HTTP 的接口 url 可以反解析出来这个 url 对应的方法的全路径。

具体来说,在项目中获取 Spring 上下文,Spring 上下文中有一个 Bean 叫 RequestMappingHandlerMapping,这个 Bean 中提供了一个方法 getHandlerMethods,这个方法中保存了一个 Java 项目中所有的对外 HTTP 方法。

这个方法返回一个 Map<T, HandlerMethod>对象,key 是 HTTP 接口的 URL,value 就是这个 URL 对应方法的全路径名称。

2)根据方法全路径,获取方法内容

根据上面的全路径名,使用 Spoon 框架我们能拿到对应方法的方法体。

<dependency><groupId>fr.inria.gforge.spoon</groupId><artifactId>spoon-core</artifactId>
</dependency>

我们让 ChatGPT 帮我们写代码,提示词:

写一个 Java 方法,使用 Spoon 框架解析 Java 方法的完整内容
其中入参是方法全路径名

PS:这个代码一会还有用,我们往下递归的话,能拿到这个 Controller 方法调用的所有方法体。

3、根据方法内容生成方法注释

就和 GitHub Copilot 和百度 Comate 代码助手一样,GPT 可以根据代码生成方法注释,提示词:

角色: 你是一个 Java 技术专家。
任务: # 号开头的是一个 Java 方法。请你逐行阅读代码,然后为这个 Java 方法生成一句话注释。
限制:不要超过 20 个字

举个例子,我有个工具方法,使用 GPT 为他生成注释,如下:

4、生成 Java 项目一句话描述

角色: 你是一个 Java 技术专家。
任务: — 符号以上的是一个 Java 项目中所有对外方法的注释,请你逐行阅读这些注释,然后给这个 Java 项目生成一句话描述。
限制: 结果不要超过两句话。

这个利用的是 GPT 的总结概要的能力,GPT 能总结论文、总结文章,他也能总结一段描述 Java 项目的文字。这样就能获取对于一个 Java 项目的一句话描述,也就是项目概览图的第一层。

5、总结:生成项目概览图

我们要求 GPT 根据 Java 项目的一句话描述,和所有对完方法的方法注释,生成思维导图数据。为了项目概览图的层级更可读、更清晰,我们可以要求 GPT 根据方法注释的相似性进行分类,形成项目概览图的第二层。第三层就是所有项目中对外方法的注释。

生成思维导图,可以让 GPT 根据结构内容生成 puml 格式的思维导图数据,我们把 puml 格式的数据存储为 puml 文件,然后使用 xmind 或者在线画图工具 processOn 打开就能看到完整的思维导图。

参考提示词如下:

应用代码:appCodeValue
项目描述:appCodeDescValue
项目描述:appCodeDescValue
方法描述:methodDescListValue
角色:你是一个有多年经验的 Java 技术专家,在集成 Java 项目方面有丰富的经验。
任务:根据 Java 项目中所有公共接口的描述信息生成思维导图。
要求:思维导图只有四个层级。
详细要求:思维导图的中心主题是 appCodeValue,第一层分支是 appCodeDescValue;第二层分支是公共接口的分类;下层分支是每个分类下方法的描述信息。
返回正确格式的 opml 思维导图 xml 数据,并且内容是中文。

二)流程图怎么生成?

1、获取递归代码

直接问 GPT,让 GPT 改造上面的获取方法体的方法。

prompt;

{获取方法体的方法}
上面的 Java 代码是使用 Spoon 框架解析 Java 方法的完整内容
其中入参是方法全路径名
任务:现在要求你改造这个方法,除了打印当前方法的完整内容,还要求递归打印所有调用方法的方法体内容,包含被调用方法调用的方法

这样,我们能获取到一个 controller 方法所有递归调用的方法,每个方法生成自己的流程图,最后通过流程图嵌套的形式进行展示。

比如这个例子,当前能看到的是当前方法的流程图,带 + 号的内容,是当前方法调用方法的流程图。这样方便我们按照自己需要的深度去了解当前方法的具体实现流程!

2、无效代码剪枝

按照上面生成的流程图可能分支很多,还有一些无效的信息,影响用户判断,我们可以通过删除一些业务无关代码的方法,精简流程图。

比如,我们可以删除日志、监控等与业务逻辑无关的代码,删除没有调用的代码(现在市面上有些这种技术方案,可以检测当前项目中没有被实际调用的代码)。

3、生成流程图

先让 GPT 根据代码生成结构化的 Json 数据。

给你一段 Java 代码,请你使用 spoon 输出结构化的 Json 数据。要求:请你直接输出结构的 json 结果数据,不需要过程代码

然后,可以让 GPT 根据 Json 数据生成流程图数据,使用流程图工具打开即可。

给你一段 Spoon 结构化 Java 代码的 Json 数据,整理对应 Java 代码的意思,生成一个流程图数据,流程图使用 PlantUML。现在请输出能直接绘制 PlantUML 图的数据

三、改进方案

我们可以从下面几个方面改进这个项目,从而实现真正落地,解决实际公司需求:

  1. 获取代码,修改为从 gitlab 等代码仓库直接拉取,这样使用的时候不需要将工具包导入到具体的 Java 项目中。
  2. 优化生图,提前生成全量图标,通过浏览器的形式进行访问。
  3. 增加图表内容手动校正功能,生成不准确的,支持开发人员手动调整。
  4. 增加检索功能,可以按照自然语言进行检索。
  5. 把项目中的方法和类信息存起来,生成更准确的图标。
  6. 根据完整项目代码,反向生成项目概要图,可能能得到更准确的概要图。
  7. 递归方法流程图,可以使用流程图嵌套,如下进行展示。

四、总结

AI 在编程领域,除了大厂都在卷的代码助手,结合自己公司还有很多可探索的地方,比如本文说的可视化 Java 项目,还可以通过分析日志,进行异常、故障的根因分析,做到快速定位问题,帮助快速解决问题,减少影响。

如果故障根因分析这个工具做出来了,阿里云的 P0 故障,滴滴的 P0 故障,还有很多大中小厂的故障,是不是能更快恢复?减少声誉、金钱损失?

就说,项目可视化这个需求,据我了解的内部消息,有些互联网中大厂已经在使用这个方式进行落地了。另外,我陪伴群里也有同学接触到了类似不少甲方的类似的强需求,如果想深入这块技术的同学,不管是进互联网大厂还是做自己的副业产品都是不错的方向!

对这个方向感兴趣,点我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot统一功能处理(Spring拦截器)

为什么需要Spring拦截器 原生的Spring AOP实现统一拦截有两大难点&#xff0c;1.定义拦截的规则难写&#xff1b;2.在切面类中拿到HttpSession比较难。为此Spring官方提供了拦截器帮我们解决了上面痛点。 实现登入信息验证拦截器 实现HanderInterceptor接口重写preHeadler方…

【LeetCode刷题】--172.阶乘后的零

172.阶乘后的零 方法&#xff1a; class Solution {public int trailingZeroes(int n) {int ans 0;for(int i 5;i<n;i5){for(int x i; x % 50; x/5){ans;}}return ans;} }进一步优化&#xff1a; class Solution {public int trailingZeroes(int n) {int ans 0;while (n…

HTML选择题试题——附答案

单选题 HTML的缩写是什么&#xff1f; A) Hyper Tool Markup LanguageB) Hyperlinks and Text Markup LanguageC) Hyper Text Markup LanguageD) Home Tool Markup Language 下列哪个标签用于定义文档的主体内容&#xff1f; A) <head>B) <body>C) <title>D)…

【个人版】SpringBoot下Spring-Security核心概念解读【二】

Spring-Security HttpSecurity Spring-Security全局导读&#xff1a; 1、Security核心类设计 2、HttpSecurity结构和执行流程解读 3、Spring-Security个人落地篇 背景&#xff1a; Spring-Security框架的核心架构上一篇已经概述&#xff0c;展示其执行流程及逻辑&#xff0c;但…

音频筑基:信噪比SNR指标

音频筑基&#xff1a;信噪比SNR指标 SNR含义SNR实例 在分析音频信号中&#xff0c;信噪比是我们经常遇到的概念&#xff0c;这里谈谈自己的理解。 SNR含义 定义 SNR&#xff0c;Signal to Noise Ratio&#xff0c;信噪比&#xff0c;也常缩写为S/N 概念 顾名思义&#xff0…

SpringBoot 整合 ExcelEasy

ExcelEasy 是一个基于 Spring Boot 的 Excel 导入导出框架&#xff0c;它提供了简单易用的 API 来操作 Excel 文件&#xff0c;可以轻松实现 Excel 的导入导出。 1. 添加依赖 在 pom.xml 文件中添加 ExcelEasy 的依赖&#xff1a; <dependency><groupId>com.ali…

【期末考复习向】transformer的运作机制

1.transformer的encoder运作 transformer的encoder部分包括了输入和处理2大部分。首先是输入部分inputs&#xff0c;这里初始的inputs是采用独热向量进行表示的&#xff0c;随后经过word2vec等操作把独热向量&#xff08;采用独热向量的好处就是可向量是正交的&#xff0c;可以…

【华为OD】双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件

题目描述:双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金,现在请你设计一个程序帮助小明计算尽可能花费的最大资金数额。输入描述:输入第一行为一维整型数组M,数组长度小于…

Qt 面试指南

一、c基础知识 1、进程和线程的同步方式 进程&#xff1a;1&#xff09;管道&#xff0c;是内核里的一串缓存 2&#xff09;消息队列 3&#xff09;共享内存 4&#xff09;信号量机制 5&#xff09;信号 6&#xff09;socket 线程&#xff1a;1&#xff09;等待通知机制 2&…

simulink自定义用户库、模块封装及案例测试

目录 前言 1. 自定义常用大模块 2. 自定义库 3.将模块加入库浏览器

re:Invent 产品体验分享:Amazon ElastiCache Serverless 缓存即时扩展功能与感受

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09;。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

C++从bing采集各行业的企业官网信息

作为一名合格的销售&#xff0c;除了自己的人脉&#xff0c;还应该有新鲜的客户加入并发掘。不管哪行哪业&#xff0c;知彼知己&#xff0c;方才能做到百战百胜。今天我就用我们的专业技能&#xff0c;让销售获取更多同行业的公开企业信息&#xff0c;让业绩顺风顺水。 通常在C…

Vue的深浅拷贝

深拷贝和浅拷贝是在JavaScript中常见的概念&#xff0c;Vue中也涉及到了深浅拷贝的问题。深拷贝和浅拷贝主要是针对对象和数组进行操作的&#xff0c;涉及到引用类型的数据。 浅拷贝&#xff1a;是指将原始对象的属性值复制到新对象中&#xff0c;如果属性值是基本类型&#x…

如何实现电脑文件夹自动备份?以下是图解教程

在当今迅猛发展的科技时代&#xff0c;电脑已经成为不可或缺的办公工具。随着使用时间的增加&#xff0c;存储在电脑中的文件数量也逐渐增多。然而&#xff0c;由于设备故障、手动误删等原因&#xff0c;文件的丢失问题成为一个不可忽视的风险。如果丢失的文件具有重要性&#…

数学learning

目录 移动平均 简单移动平均 加权移动平均 指数移动平均 矩阵求导 矩阵对标量求导 Matrix-by-scalar 标量对矩阵求导 Scalar-by-matrix 参考博客 移动平均 优化算法里面会涉及到一个知识点&#xff1a;指数移动平均。 但是为了知识的完整性&#xff0c;这里会将常见的移动…

什么是DNS解析?DNS解析的过程是什么样的?

IP是网络上计算机的电子方位符具有唯一性&#xff0c;计算机之间通过IP进行地址确认和通信。但IP地址由一串纯数字组成&#xff0c;不方便人们的记忆和输入&#xff0c;人们很难记住太多网站的IP地址。域名的出现在一定程度上解决了这个难题&#xff0c;与IP地址相比&#xff0…

基于微信小程序的校园二手闲置物品交易平台的设计与实现

基于微信小程序的校园二手闲置物品交易平台的设计与实现 "Design and Implementation of a Campus Second-Hand Marketplace Platform based on WeChat Mini Program" 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的和意义 5 1.3 国内外研究…

MCU平台下一种简单的文件系统设计构想

本文介绍MCU平台下一种简单的文件系统设计构想。 在使用MCU的项目中&#xff0c;经常会涉及到一些数据的存储&#xff0c;受限于硬件&#xff0c;又不太可能直接上文件系统&#xff08;如FAT文件系统&#xff09;&#xff0c;直接指定存储地址&#xff0c;数据长度对数据进行读…

React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题

最近遇到一个React上传组件的问题&#xff0c;即上传附件成功后&#xff0c;文件展示处仍然还有之前上传附件的缓存信息&#xff0c;需要解决的问题是&#xff0c;要把上一次上传的附件缓存在上传成功或者取消后&#xff0c;可以进行清除 经过一顿试错&#xff0c;终于解决了这…

工业相机采集的图像亮度如何增强?

工业相机采集的图像亮度如何增强&#xff1a; 1、图像亮度在相机的软件端&#xff0c;除了提升曝光时间可直接提升图像亮度以外&#xff0c;更改数字增益&#xff0c;模拟增益或打开相机的Binning(若支持)时&#xff0c;也会增加图像亮度。若使用TDI线扫相机&#xff0c;更改较…