发布时间:2026-02-21
浏览次数:0
https://.cn/post/
1. 前言
推出一个开源项目,能够以优雅的方式为Java or项目打造类图。
本文按照下面的脑图顺时针展开,揭开这一工具的诞生过程
2. 主要问题与方案背景
毫无疑问,精确的、至关重要的算法流程图,以及时序图、组件图、状态图、类图等等,对产品自身的维护以及发展有着极大助力!对于研发工作者来讲,能高度概括流程、设计、算法等的专业工具图对工作有着非常大的帮助。既然需要审核的文档里也有这些内容,并且又对工作有帮助,那为什么不做得更好一些呢。
上文所提及的各类UML图里边,类图Class -那可特特殊殊了,它所表述描述的是类与类之间的关系intellij idea类图,经过基于源码文件展开分析能够得出精准无误的结果。与之不同的是,流程图 ,加上时序图 ,包括状态图 ,还有组件图 等这一些却没办法做到如此。
问题
身处行业持续发展进程之中,软件开发已然转向以迭代形式,一个步骤接着一个步骤地去达成最为关键的功能,实现不断地阶段性派送输送,按顺势自然地走向,我们现今已不像几十年前先辈们那般行事:在代码毫无着手动作时,文档和UML图赶在前面先行搞定。通常是在概要设计完毕之后,确认方案具备可行性便开始着手编码工作了。
针对我的实际情形,复杂一些功能往往于草稿纸上绘制绘制草图,简单点儿的就在脑子里面思索思索,如此这般难以留存存档,在这样一种工作模式之下,笔者也碰到过一些情况。
假设这件事能交由机器去做,那分明是再好不过啦,且使机器去维护类图是最为易于达成的吧,我们需有一款工具或者插件,它能够径直依据源码生成类图,或者生成其间产物,像是 plant-uml 文件那般,还能够与其他工具链相配合,直接予以归档。
留有类图的好处:
解决方案
举世皆知,-Idea的官方插件针对类图具备分析能力,然而,Idea属于收费性质的软件,为官方插件提供付费支持,此实乃一份兼具节省时间与精力特性的方案,也就是所谓的兜底方案之事。直至最终穷途末路之际,我们才思虑对其加以考量。
编码时分析
按照官方插件之中的思路予以仿照,依靠源码文档树去展开分析,在相应支持的情况下,基于PSI以及uast便能够分析出类与类之间的关系,这是需要有着一定 PSI、uast知识基础的。
编译时分析
在整个编译的环节当中,存在着一些切面,这些切面是用来应对特定问题的,比如说:“注解处理”,在此切面的地方,我们能够基于编译的中间产物,通过间接的方式分析出类之间的关系。
最为简单的情形是,注解处理阶段进行介入,而这仅仅需要对于和有一定的知识基础就行。
运行时反射分析
显然这不是一个太好的切入点,直接pass。
由于在PSI相关的知识体系方面,所掌握的不够全面,且跨越较大版本时,会出现较大变动,然而在注解处理方面的知识,还算可以,所以弄个类图生成没有很大问题。
附注:以核心二次开发为依据,PSI插件依照Idea大版本来开展适配。
所以,最终的方案是这样的,从注解处理的阶段开始着手,去分析编译过程当中的中间产物,最终达成生成类图的结果。
3. 问题分治与解决分治1 -- 简化输出产物
当确定了那个所谓的大方向之后,我们是真的务必得再去好好思考、琢磨琢磨整个问题所涉及到的方方面面。而生成类图,存在着两大问题是亟待去解决的呀:
由编译的中间产物里剖析出类关系,或者从源码之中解析出类关系,(补充说明:我们已然明确了要以编译中间产物为起始点)
将类关系转变为图
很明显,要去开发一个专门用于生成图的引擎,这样的事情成本高得离谱同时没必要。幸运的是,UML并非一个全新的事物,在业内也存在声名远扬的。
因基于此,其本身运用Dot语法去描述元素与元素间的关系,直接采用这种方式显得较为朴素,借由自定义语法,能让内容的可阅读性得以提升,并且无需去关注转换图片时开展各类装饰方面的问题。
于是,我们能够把问题转变为:从编译的中间产物里剖析出类关系,把关系依照语法生成puml文件,该文件的内容是纯文本。
分治2 -- 确定分析的起始点
如果从最终呈现的结果来进行观察,我们所获取到的是一个具备方向的图,这样的话,依照图自身所设定的起始点去开始行动,则是比较契合习惯的做法。
我们会给起始点对应的类添加注解,把它当作注解处理的目标起始之处,就是这样。
例如:
Cat 和 Dog 将作为起始点。
因为只需要标记类,我们约定注解:
@Target(AnnotationTarget.CLASS)
annotation class GenerateClassDiagram {}
在代码上,将表现为:
class Animal
@GenerateClassDiagram
class Dog : Animal()
@GenerateClassDiagram
class Cat : Animal()
于示例里面,当我们在进行处理,能够扫描而获取到 Cat 再加上 Dog 类所对应的 javax.lang.model.. 示例,在下文中简称为。
几点可能存在的疑惑:
分治3 -- 确定关系的分析方法继承&实现
鉴于注解的标记对象为类intellij idea类图,或者是接口,我们应当能够获得,基于此的访问者模式实施,这一情况并不复杂且,这一点并不难。
public interface TypeElement extends Element, Parameterizable, QualifiedNameable {
TypeMirror getSuperclass();
List extends TypeMirror> getInterfaces();
//其他无关代码略去
}
显然无需言语说明的是,我们在能够借助 (); 从而可以获取到继承关系,并且还能够凭借 List。
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码