从 Java 代码逆向工程生成 UML 类图和序列图

from:http://blog.itpub.net/14780914/viewspace-588975/

本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM? Rational? Software Architect 从 Java? 源代码来逆向工程生成 UML 类和序列图。 逆向工程经常被用来从已有的源代码中以一种抽象模型 UML 格式来获得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行为,并用于扩展新的特性到产品。 作者详细说明了使用 IBM Rational Software Architect 进行逆向工程的限制,并阐述了克服这些限制的技术。 您将从使用这些技术技巧和窍门中受益,以识别组件,并从 Java 类中产生像 UML 类和序列图这样的高层抽象。

软件结构师、开发人员及测试人员都熟知统一建模语言(UML),该语言适用于文档化用例、类图、序列图和其他图表。也可以通过其他许多软件辅助工具来帮助软件工程师来完成这些工作,或者是 正向工程 或者是 逆向工程的。

  • 正向工程是对一个系统物理结构实现的高层抽象性、逻辑性及独立性设计的传统处理过程。
  • 逆向工程是对一个已存在系统的分析处理,以鉴别它的组成部分及它们的内在联系,从而以高层抽象性来构建一个系统的框架。在大多数情况下,逆向工程用于以抽象的模型 UML 格式从已存在的源代码中,提取已丢失的设计文件,从而同时可得知一个系统的静态结构及动态行为。

类及序列图问题的实质

IBM? Rational? Software Architect 在很多工业中得以广泛采用,因为它提供了很多的特性以帮助逆向工程师。 问题是当您以 Java? 代码逆向构建 UML 类及序列图时,Rational Software Architect 不能自动地产生有用的 UML 类及序列图。 但是已经存在改善 Rational Software Architect 输出产物的技术。本篇文章论证了怎样使用这里介绍的技术技巧,从 Java 代码中识别其组成部分及对 UML 种类和序列图进行高层的抽象。

使用逆向工程,您可以很容易就从正向工程中得到您想要的,本篇文章将介绍在逆向工程以下领域中存在的问题:

  • 发现其抽象类及识别它们的等级结构
  • 产生具有聚合及关联关系的高层抽象性的类图
  • 构建序列图

接下来的部分为每个问题提供一个解决方案,并论证了怎样产生有意义的类及序列图。例子向您展示了怎样从一个已给 Java 项目的源代码中,识别一个系统的继承关系及组成部分,以对 UML 类图及序列图进行高层的抽象。

注意:
本篇文章中的例子产生于 Rational Software Architect 7.0 版本

识别一个 UML 类图的继承树

继承关系是一种普遍的对象型的模式。它允许一组类共享共同的状态和行为,从而子类可以从父类那里继承共同的状态和行为。从一个已存在系统中发现整个的继承树结构是相当有用的,因为它能向您揭露在树中什么是顶级类以及什么是子类。而且,您可以识别一个继承树中有哪些共同状态及行为,以及这些共同行为怎样起作用。您可以在探索过程中以以下三种方式使用
Rational Software Architect。

  • 从一个工作场所或工作集中发现其抽象结构
  • 从抽象结构表中选择一个类从而显示其抽象类图
  • 在一个浏览表中研究树状结构,您会发现显示在 Abstraction之下的一系列抽象类。

第一步是在一个已存在系统中自动得到其顶级类。这样您就能使用这些类作为切入点以研究继承树中的类。您可以按以下步骤来完成此项。

  1. 打开 Rational Software Architect 中 Diagram Navigation视图。
  2. Object-oriented Pattern下,右键点击 Abstraction,然后点击 Discover Architecture(如图 1 所示)。

这可以揭示整个工作空间的架构。

图 1.发现整个工作空间的架构

图 2 显示了得到一个抽象类图的树状结构所需的剩余步骤:

  1. 通过右键点击位于 Abstraction之下的类 Car来打开内容菜单。
  2. 显示右边面板中 Car类图,通过选择菜单中的 Show Diagram选项。
  3. 通过选择并右键点击右边面板中类图 Car来打开内容菜单。
  4. 通过选择内容菜单中 Explore in Browse Diagram选项来产生抽象类图的树状结构。

做完第六步,您将在右边面板中见到 Car类图的树状结构。

图 2. 从整个工作场所中发现其抽象结构

结果有以下缺陷:

  • 结构树中被发现类的同类及子类可能被丢失。
  • 除去被发现的抽象类之外,其他类没有属性及操作。

要得到第六步产生的树状结构,还需其他的步骤。您需要增加分离度(如图 3 所示),这决定了从被发现类扩展的层。

图 3. 改变分离度

默认度是 1,这就是为什么在继承树中一些子类会丢失的原因。在本例中,分离度被增加至 2。

第二个问题是除了在树状结构中被发现的类,其他类没有属性和操作。这不利于使用者出于再使用的目的来研究已存在的普遍模式。

接下来的例子将向您展示,怎样识别具有任意属性及操作的整个继承树。

  1. 向 Rational Software Architect 载入一个 Java 项目。
  2. 切换至 Diagram Navigation视图,按以上步骤所述,从工作场所中发现其抽象结构。
  3. 从您感兴趣的第二步中找出一个抽象类。
  4. 通过寻找模型搜索器中的类,找出等级树状结构类 ,双击打开编辑器中的类,按下 F4以打开等级树。确保 type hierarchy已被选择。
  5. 右键点击类,并将其转变为一个可视的类图,通过选择 Visualize > Add to New Diagram File > Class Diagram,如图4所示。
  6. 通过右键点击并选择 Visualize > Add to Current Diagram来向当前的图添加剩余的类。

图 4 . 将类可视化为新的类图

图 5 展示了产生一个继承树类图的过程:

  1. 打开并按下 F4以显示类的等级。
  2. 选择每一个类并将其添加到类图中。
  3. 检查并完成右边的图。

图 5. 产生一个继承树类图的机理

类图以 Rational Software Architect
默认格式产生。有几个有用的修改可以帮助您将图表进行可视化。例如,您可以修改连接路径样式以使用树状样式路径
,并且您可以通过在工作区右键点击来打开内容菜单然后点击 Arrange all。到此产生的类图要比自动产生的看上去更好。如图 6 所示。

图 6. 带有属性的继承树状图及树状路径连接

图6中的类既显示了属性又显示了操作。属性及操作显示的好处在于,您可以研究它们共同的状态及行为,从而进一步了解一个已存在系统是如何被实现的,这将有助于系统的再使用。

产生一个高层的 UML 类图

Rational Software Architect 能让您通过从一个Java项目中,选择多个 Java 文件,来产生类图。

  1. 在模型搜索器中,使用 Visualize来将它们添加到一个新图或当前的类图中。

如果多个类已经被添加到当前的图中,那么它们之间的关系也将被显示。

图 7 是一个从 Java 代码中自动产生的类图的例子

图 7. 一个自动产生的类图

如图 7 所示,您可以从模型搜索器中选择多个 Java 文件 来将它们在新的类图中可视化。如果您想添加更多的类,您可以选择更多的 Java
源代码来将它们在当前的类图中可视化。本图显示类包括在项目及它们的基本关系中。这有利于在项目中自动发现 UML
类,但是自动发现的关系在这里用处不大。

在图 7 中,几乎所有的关系是 use除去继承关系。使用关系太过平常以至于不能给出有用的设计信息,越来越多的特别的聚集及组成关系被隐藏了甚至当所有的关系在图中都出现过。聚集关系表现为一对多关系当一个类含有其他类的很多项目时,组成关系用于描述一多一关系当一个类仅含有其他类的一个例子时。这个高层的抽象意味着对类之间更精确的关系发现,并为本设计的执行提供了有用的信息。这个类图如果没有抽象关系的细节将不再像以前那样有用。

这里,我们尝试并探索了,以半自动方法产生UML类图的高层抽象方案。 UML 类以和以前同样的技术发现,并且类间的关系由人为指定。高层的抽象方案基于研究已有源代码所必须的知识。

图 8 的例子显示了,怎样应用这个方法来得到高层的 UML 类图。

图 8. 使用 UML 模型向导建立一个空白模型

为了得到一个高层的类图,您必须首先建立一个空白模型。

  1. 按图 8 所述步骤建立一个新的空白模型:

    1. 在文件种类下,选择 UML Modeling
    2. 在模板下,选择 Blank Model
    3. 在文件名区域,输入 Blank Model
    4. 对于目的文件夹,输入 example
    5. 默认的图检查框 "Create a default diagram in the new model" 应该被检查。
    6. 对于默认的图种类,选择 Freeform. Diagram
    7. 点击 Finish

接下来的一步是从自动生产类图中总结选择的类。 Rational Software Architect
中的总结,能让您从一个类中拷贝一个类并粘贴到另一个类图中,这必须在一个空白模型中完成。如果您将总结的类粘贴到同一个类图,或本空白模型以外另一个类图中时,那么该类的属性和功能将丢失。

  1. 通过图 9 所示的步骤,从自动生成的类图中总结已选择的 Java 类:

    1. 从 classdiagram2.dnx 中选择类 FuelTank,Engine,Passenger以及 Car
    2. 在一个已选类上右键点击以打开内容菜单
    3. 选择 Harvest菜单
  2. 将已总结的类粘贴至分离的创建于步 2 的类图中。
  3. 在类间创建聚集及组成关系。

图 9. 一个类图中的总结类

下一步,在类间创建关联关系,这使您能够在聚集及组成关系中选择一个。图 10 显示了一个高层的类图。

图 10. 半自动方法产生的 UML 类图的高层抽象

通过将图 10 与图 9 进行比较,您可以发现半自动方法能精确显示类间关系。本图可用于独立设计执行文件,或已有系统远期改善。

着重点:
如果不经过总结,聚集及组成关系将不能应用于 Rational Software Architect 。

创建一个序列图

序列图是应用最为广泛的 UML 动态建模方法。它致力于识别一个系统的行为。一个序列图通常应用于建模用例,以显示一个系统的方法及功能。

Rational Software Architect 不能从 Java 代码中自动创建一个序列图。下面的步骤会告诉您怎样去创建一个:

  1. 创建一个空白模型。
  2. 创建一个序列图:
    1. Blank Model上右键点击。
    2. 从 drop-down (context) 菜单中,选择 Add Diagram然后选择 Sequence Diagram(如图 11 所示)。
  3. 向序列图添加类。
  4. 在两个类间对方法标记进行排序。
  5. 保存序列图。

图 11. 创建一个序列图

当您完成创建一个序列图,一个序列文件产生于 Collaboration: Interaction 标签下。 您可以从 Java 代码中向序列图添加类。二者均见于图 12 。

图 12 的主要工作区显示了一个序列图的例子。

图 12. 产生于 Java 源文件的序列图

一个方法调用意味着信息从召集者传向被召集者。被召集者是方法所有人,它从方法召集者那里收到信息。信息可以是单道的也可以是双道的。一个序列图由在处于一组方法所有者及一个初始发起者之间的,一系列方法标记组成。第一个标记必须从发起第一个方法标记的地方开始。

总结

本篇文章论证了怎样通过应用 Rational Software Architect v7.0 ,从 Java 代码中使用逆向工程创建
UML
类及序列图。层级类图代表着一种方式,该方式能发现在一个项目或工作集中,发

时间: 2024-08-26 06:43:45

从 Java 代码逆向工程生成 UML 类图和序列图的相关文章

java代码逆向工程生成uml

今天在看一个模拟器的源码,一个包里有多个类,一个类里又有多个属性和方法,如果按顺序看下来,不仅不能对整个模拟器的框架形成一个大致的认识,而且只会越看越混乱,所以,想到有没有什么工具可以将这些个类以及它们之间的依赖关系转化成UML图,这样一看图就能一目了然.立刻搜了看,没想到这样的工具一大堆,下面罗列最经典的6款.参考:http://www.csdn.net/article/2012-09-12/2809862-6-java-to-uml-tools 1.Eclipse MDT 模型开发工具(MD

Myeclipse中把java代码导成UML类图

1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图中 2)如果要把单个类导成类图,则把单个java类拖到类图中 4.右键点击类图,选择Export All Diagrms 5.点击Browse选择导成的类图的路径,选择导出的图片的格式,点击finish,生成图片.

用MyEclipse将java文件转换成UML类图

用MyEclipse将java文件转换成UML类图 参考: 用MyEclipse将java文件转换成UML类图 - 君临天下的博客 - CSDN博客  http://blog.csdn.net/dan15188387481/article/details/50053807 MyEclipse画UML用例图并生成JAVA代码(图文详细步骤) - 蘑菇猎手的专栏 - CSDN博客  http://blog.csdn.net/donggege214/article/details/48791413  

《Nodejs开发加密货币》之二十六:轻松从Js文件生成UML类图

前言 上一篇<函数式编程入门经典>,罗嗦了很长,很多小伙伴看得云里雾里.这里提供一个实例,让大家切身感受函数式编程的奥妙和趣味.当然,仅仅为了举例而写代码就没有什么意义了,本书提供的例子都是承担了某项任务的具体项目或工具,这个例子自然也不能例外. 本书用到了大量的Uml类图,经常有小伙伴问我用什么工具画的.说实话,前几篇是我个人一点点手工整理的,但后来就感觉在浪费生命,作为程序员,怎么可能容忍这样的事情反复发生.所以,就有了 js2uml(见参考)这个小工具.只不过,当初目的单一,仅仅使用正则

java 代码如何生成 chm

由于要把一个框架的东西打成 chm, 今天在网上找了几篇文章 http://blog.sina.com.cn/s/blog_5d31611a0100gqwp.html 李顺利 首先第一步,从eclipse开始说起 ,选中你要导出的代码 一直next 下去好了 记住你的 Destination,特别注意一下你编码 我用的是GBK  (-encoding GBK -charset GBK) 点击完成就了, 接着需要将 jd2chm.exe cpoy开始生成的目录下去 , 并用cmd进入该目录,如图所

使用VS2013逆向生成UML类图

引自http://blog.csdn.net/funnyfu0101/article/details/7705173 首先.打开工程,[体系结构]->[新建关系图] 生成一个类图 然后[体系结构]->[窗口]->[体系结构资源管理器] 然后还可以通过[工具箱]画相应的关系

最常用的UML图包括:用例图、类图、序列图、状态图、活动图、组件图和部署图

(转) 用例图 用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色" (actors,也就是与系统交互的其他实体)关系,以及系统内用例之间的关系.用例图一般表示出用例的组织关系--要么是整个系统的全部用例,要么是完 成具有功能(例如,所有安全管理相关的用例)的一组用例.要在用例图上显示某个用例,可绘制一个椭圆,然后将用例的名称放在椭圆的中心或椭圆下面的中间位 置.要在用例图上绘制一个角色(表示一个系统用户),

UML学习(类图和序列图等)

visio绘制UML图使用visio 提示此UML形状所在的绘图页不是UML模型图的一部分 请问这个问题怎么解决?新建->选择绘图类型->选择软件与数据库模板->选择UML模型图->注意:如果不选择UML模型图的话,可能会出现无法编辑形状文本,提示“此UML形状所在的绘图页不是UML模型图的一部分,该形状设计用于利用UML模型图模板创建的绘图”所以利用Visio绘UML图第一步就是选择绘图类型为软件中的UML模型图. 还可以参考百度云盘的UML学习资料 参考:UML中几种类间关系:

Java的IO输入输出流类的介绍(有图)

一.字节流 1.InputStream/OutputStream(输入流与输出流几乎一一对应) 读取的方法   int read()   int read(byte[] buffer)   int read(byte[] buffer,int offset,int length) 2.各种类的区分,常用的9种(按处理的基本单位划分) 2.1.以字节数组为颗粒(颗粒就是基本单位的意思) ByteArrayInputStream 2.2.以文件为颗粒 FileInputStream 2.3.管道流(