可视化 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 框架我们能拿到对应方法的方法体。

java 复制代码
<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 故障,还有很多大中小厂的故障,是不是能更快恢复?减少声誉、金钱损失?

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

对这个方向感兴趣,点我

相关推荐
lee_curry2 分钟前
AI Agent 工程师完整学习路线(面向生产级项目与面试)
人工智能·学习·ai·面试·agent
大模型真好玩7 分钟前
DeepSeek Harness 入门很简单(二)——DeepSeek Harness通用设置及Agent预设详解
人工智能·agent·deepseek
血小板要健康8 分钟前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪8 分钟前
【多线程】CompletableFuture使用
java·开发语言·多线程
前端世界10 分钟前
基于 Linux 的本地 AI 智能问答平台搭建实践 —— Ollama + FastAPI + Nginx 实现本地大模型 Web 服务
linux·运维·人工智能
小小小小钰儿12 分钟前
1.2-AI核心理论与术语
人工智能·计算机·网络安全·信息安全·程序员·编程
桃西西呀15 分钟前
"循环深度"让小模型免费变大?GPT-6 Astra 背后的潜空间推理原理,8 个误读我替你拆了
人工智能·gpt·llm
数智工坊18 分钟前
NTIRE2024×4图像超分竞赛综述|Mamba崛起、数据缩放、频域增强成为新趋势
网络·人工智能·深度学习·cnn·机器人
m0_5873830026 分钟前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
Raas10030 分钟前
AI网关和大模型网关区别?MAI Gateway(魔芋企业级AI网关)如何实现AI流量统一治理
大数据·人工智能·gateway·ai网关·mai gateway·企业级产品