1

我对我的程序有疑问。我的程序应该能够从 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;
}

此代码的注释:

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

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

4

4 回答 4

1

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

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

于 2012-04-19T11:18:30.007 回答
1

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

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

于 2012-04-19T11:29:52.857 回答
1

添加之前的两个答案和您的评论,尤其是关于。'纯Java代码'。

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

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

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

手写解析器不是一件小事。您关于创建枚举类等的评论表明这就是您的想法。然而,手工编码的解析器仅在极少数情况下是推荐的解决方案。有一整套理论和实践致力于解析算法和技术。我真的不确定您是否想为您的项目参与其中。

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

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

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

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

我不确定这是否有帮助。也许您可以多解释一下“纯 Java 代码”约束。

于 2012-04-19T15:26:51.017 回答
0

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

于 2012-04-20T07:52:27.897 回答