【问题标题】:Java : parse java source code, extract methodsJava:解析java源代码,提取方法
【发布时间】:2010-02-05 09:08:08
【问题描述】:

我想解析java源代码文件,提取方法源代码。

我需要这样的方法:

/** Returns a map with key = method name ; value = method source code */
Map<String,String> getMethods(File javaFile);

有没有一种简单的方法来实现这一点,一个库来帮助我构建我的方法等?

【问题讨论】:

  • roaster 提供了一个流畅的 API 来处理 Java 代码。
  • @koppor 也可以解析源代码中的 catch 块吗?

标签: java parsing


【解决方案1】:

https://javaparser.org/下载java解析器

您必须编写一些代码。此代码将调用解析器...它将返回一个 CompilationUnit:

            InputStream in = null;
            CompilationUnit cu = null;
            try
            {
                    in = new SEDInputStream(filename);
                    cu = JavaParser.parse(in);
            }
            catch(ParseException x)
            {
                 // handle parse exceptions here.
            }
            finally
            {
                  in.close();
            }
            return cu;

注意:SEDInputStream 是输入流的子类。如果需要,您可以使用 FileInputStream。


您必须创建一个访问者。您的访问者会很容易,因为您只对方法感兴趣:

  public class MethodVisitor extends VoidVisitorAdapter
  {
        public void visit(MethodDeclaration n, Object arg)
        {
             // extract method information here.
             // put in to hashmap
        }
  }

要调用访问者,请执行以下操作:

  MethodVisitor visitor = new MethodVisitor();
  visitor.visit(cu, null);

【讨论】:

  • 很好的答案。欣赏努力。谢谢。
  • 很好的答案很好。谢谢,即使在今天它也能帮助人们;)
  • 项目维护在github.com/javaparser/javaparser,几周前我们发布了2.1版(完全支持Java 8)。享受吧!
  • Javac 编译器 API 在 JDK 中具有完全可访问的解析 API。这有点复杂,但您可以获取系统编译器 (ToolProvider.getSystemJavaCompiler()),通过compiler.getTask(...) 获取其JavacTask,并通过task.parse() 解析它,它返回CompilationUnitTrees 的集合。 Sun/Oracle 解析器实际上比 ECJ 解析器快得多,尽管它没有 ECJ 能够提供的相同级别的错误推断(例如,ECJ 可以就您的意思给出建议,或部分解析代码“大部分”是正确的)。
【解决方案2】:

QDOX 是一个更轻量级的解析器,它只解析到方法级别,即方法体没有被解析为语句。它或多或少地为您提供您所要求的,即使您需要导航模型以找到正确的名称,因为它不会按名称索引类和方法。

【讨论】:

  • 更易于使用,可在 Maven 存储库中使用。
  • 甚至有更好的许可 (Apache 2)
  • JavaParser 在 Maven 存储库中可用(我们刚刚发布了 2.1 版)
  • JavaParser 现在也可以在 Apache 2 下使用
  • @Felix 也可以获取文件中的所有catch块吗?
【解决方案3】:

您可以使用解析器生成器之一构建您的解析器:

  1. ANTLR
  2. JavaCC
  3. SableCC

此外,您可以使用(或研究其工作原理)现成的东西。有使用 JavaCC 的 Java Tree Builder 和使用 ANTLR 的 RefactorIt

【讨论】:

  • 能否同时获取源中的所有catch块?
【解决方案4】:

您能否在 JavaDoc 中使用自定义 doclet?

Doclet.com 可能会提供更多信息。

【讨论】:

    【解决方案5】:

    JavaCC 是 Java 的“编译器-编译器”(解析器生成器)。它有很多语法文件,包括一个用于 Java 1.5 的语法文件。

    【讨论】:

      【解决方案6】:

      我认为你可以使用ANTLR解析器生成器。

      它非常易于使用,ANTLR 网站有很多用 Java 编写的示例。

      它还带有一个eclipse插件。

      【讨论】:

      • 能否请您添加一些关于如何使用 ANTLR 提取方法的具体示例?我能够解析检索单个标记的 java 代码(例如“public”、“static”、“void”...),但是我错过了下一步。
      【解决方案7】:

      你可以使用这个 repo。 https://github.com/minqukanq/method-extractor/blob/main/README.md

      method-extractor 是 Java、Python 的解析器。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 更重要的是,不鼓励仅链接答案。始终提供足够的内容,以便您的输入回答手头的问题,即使您的链接断开。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多