如何从加载的Java代码创建UML图?

时间:2012-04-19 11:06:34

标签: java parsing uml

我对我的节目有疑问。我的程序应该是能够从Java代码创建UML图,但我不知道,如何设计方法,它将检索(加载)Java关键字,对象等。注意:我不能使用自动程序来创建UML图。这是我的论文。

我的想法是创建带有Java关键字的枚举类,可以在UML图中看到,并使用此枚举检查所有加载的代码。但是有几个问题,我无法解决,特别是空间。下一个问题如下:

例如我有代码:

[space][space]public[space]class[space][space][space]SomeClass[space]{
[empty line]
private int something;
public BufferedReader br;
private ArrayList<File> al;
}

此代码的评论:

  • [space]代表代码中的经典差距。
  • 我强调了目的上的差距,因为它在语法上是正确的。
  • 我不知道如何将所有Java类加载为BufferedReader,ArrayList等或其他对象。

感谢您的回复。我想有更好的方法来解决这个问题。

4 个答案:

答案 0 :(得分:1)

您应该考虑使用一个为您解析Java代码的库。当然我不能告诉你一个,试试谷歌。

以下是我将遵循的方法。首先阅读关于Eclipse Abstract Syntax Tree的这篇文章。使用Eclipse AST意味着您将工具设计为eclipse插件。如果您不想这样做,那么本文将为您提供一些如何解析源代码树的提示。

答案 1 :(得分:1)

如果你可以使用编译代码,那就太好了。在java中,您可以加载没有初始化的类,并使用 java.lang.reflect 检查其结构。当然,参数名称将丢失。

有关更多详细信息,还有其他类解析库,如ASM。

答案 2 :(得分:1)

添加前两个答案和您的评论,尤其是重新评论。 '纯java代码'。

假设我理解你的问题,你要做的第一件事就是将java源代码(即文本文件)转换成一些数据结构。从那里,您可以为数据结构生成UML图。

假设这是一个非常常见的模式。通常有两种方法可以将文本转换为数据结构:

  • 解析文本(由@ user714965建议)
  • 使用反射(由@Joop Eggen建议)

手写解析器不是一件轻而易举的事。您对创建枚举类等的评论表明您正在思考的问题。但是,在极少数情况下,手动编码的解析器只是推荐的解决方案。有一整套理论和实践致力于解析算法和技术。我真的不确定你是否想参与你的项目。

大多数人会使用解析器生成器(例如antlr)从语法定义生成解析器。鉴于java的流行,antlr现有at least one现有的java语法。我不太确定'纯Java代码'约束意味着什么。 Antlr生成一个纯Java代码解析器,这样就可以了。如果你的意思是你需要从头开始编写所有代码,那么使用解析器生成器就会出来。但这似乎是一个非常奇怪的限制......

反正。你的另一个选择是使用反射。这实际上是使用JVM中的解析器,并为您提供查询和访问的API访问权限。导航代码本身。 java.lang.reflect(显然)也是纯java - 所以你调用它的代码也是如此。

Eclipse / Netbeans API将为您提供另一种可能的路径。实际上它们只是另一个“解析器”,它提供了一组代表你的java代码的数据结构。

我强烈推荐这三种方法中的一种,而不是手工编写自己的解析器。

我不确定这是否有帮助。也许你可以更多地解释'纯Java代码'约束。

答案 3 :(得分:0)

只需选择像JavaCC一样的解析器生成器(您的任务1)。使用完成的Java语法(或构建自己的语法)。生成Lexer(2)并将自己的Parser内容写入语法(3)。从解析器中保存树和/或首先修改它以获得XML / XMI表示。 对于5)你应该真正选择一个现有的工具,因为写一个自己的工具可以是一个完整的附加论文...