Java:解析Java源代码,提取方法

Java:解析Java源代码,提取方法,java,parsing,Java,Parsing,我希望解析java源代码文件,并提取方法源代码 我需要这样一种方法: /** Returns a map with key = method name ; value = method source code */ Map<String,String> getMethods(File javaFile); /**返回键=方法名的映射;value=方法源代码*/ 映射getMethods(文件javaFile); 有没有一个简单的方法来实现这一点,一个库来帮助我构建我的方法,等等?

我希望解析java源代码文件,并提取方法源代码

我需要这样一种方法:

/** Returns a map with key = method name ; value = method source code */
Map<String,String> getMethods(File javaFile);
/**返回键=方法名的映射;value=方法源代码*/
映射getMethods(文件javaFile);

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

你能将自定义doclet与JavaDoc一起使用吗

可能会提供更多信息。

是一个针对Java的“编译器”(解析器生成器)。它有许多语法文件,包括一个用于Java1.5的语法文件。

我认为您可以使用解析器生成器

它非常容易使用,而且站点上有很多用Java编写的示例


它还附带一个eclipse插件。

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


  • 此外,你可以使用(或研究它是如何工作的)现成的东西。有使用JavaCC和ANTLR的两种方法。

    从下载java解析器

    你必须写一些代码。此代码将调用解析器。。。它将返回一个编译单元:

                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);
    

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

    回答得很好。感谢你的努力。谢谢。很好的答案很好。谢谢,即使在今天,它也能帮助人们;)该项目不再维持。检查引导您进入项目的是维护在,我们在几周前发布了版本2.1(完全支持Java8)。享受吧@李,是的,我知道它有一个编译器,但这和解析器不同。编译器需要解析符号,因此您需要具有使用该符号的依赖项。有些代码可以解析,但无法编译(因为语义错误)。所以他们不是一回事。解析器是编译器的第一步。JavaParser允许构建AST、修改它并写回代码。我不知道你能用编译器API做到这一点。是吗?更易于使用,并且可以在Maven存储库上使用。即使有更好的许可(Apache 2),JavaParser也可以在Maven存储库上使用(我们刚刚发布了版本2.1)JavaParser现在也可以在Apache下使用2@Felix它还能得到文件中的所有catch块吗?你能给我添加一些关于如何使用ANTLR提取方法的具体示例吗?我能够对检索单个标记(例如“public”、“static”、“void”…)的java代码进行解析,但是我错过了下一步。提供了一个流畅的API来处理Java代码。@koppor它还能解析源代码中的catch块吗?它还能获取源代码中的所有catch块吗?