使用IDEA分析类的关系
2017/3/20 | 周一 | 雨
今天在分析线程池的相关类的时候,偶然发现了IDEA类图分析的功能,用起来非常方便。
打开Diagrams窗口
任意选中一个类,使用快捷键Shift + Ctrl + Alt + U打开:

这个图默认显示的是刚才选中的类,而且没有显示任何其他信息。顶部的工具栏,可以筛选显示的元素,比如选中第三个选项,可以显示类的方法:

其他的选项可以自己去看看,不再一一介绍了。
添加类
首先把这个类从图中删除:在图中选中类,按Delete键删除。

然后添加你敢兴趣的类。你可以直接把类拖进来:

也可以通过空格+类的名字来添加:

注意
2017.1版本的出现了一个bug,无法通过这种方式添加类。bug已被提交到这里,目前尚未被修复。
如果你添加的类和已有的类之间有继承关系,那么这个关系会被自动标识出来:

按下Alt再移动鼠标,会有放大镜的效果:

在这个基础上,去探索其他的功能吧。比如可以从类图跳到具体方法的源代码位置,比如可以过滤显示public或者其他级别的元素。
为什么说这个工具好用?
有些时候我们需要分析特定的几个类,现在只需要找到这些类,把它拖进来就好了。

比如我在分析线程池的时候,用的是上图。左侧是任务的接口,中间是线程池的继承结构,右侧是任务的执行结果。Executors是一个工具类,用于创建线程池的实例。这样就很清晰了。我一般使用截图工具将它截图到onenote上,然后在附近添加注释。

这个是我在分析阻塞队列时用的图。
它让我们的焦点得以集中。快速、便捷、集中,想想看以前我要分析特定的几个类的时候,都是要自己查API,画类图的。
它还有哪些缺点
它可能显示不完整

比如上图中最下面的几个方法,都没有显示完整,而且不可以手动调整大小,所以目前还没有解决办法。
它没有实现高度定制
只把我想关注的类集中起来,这个是做到了。但是有些时候我只想关注其中某一个类的方法,却无法做到,要么所有类的方法都显示,要么都不显示。有些时候我还想只关注某个类的部分方法,也做不到,只能根据访问控制符进行简单过滤。
无法主动添加其他图形
这个要求可能高了点,因为这是对于一个画图工具的要求。比如上文中提到的线程池的分析图,我很想画几个框把不同角色的类框起来,但是这里做不到。