Java:解析java源代码,解压缩方法

glm*_*ndr 48 java parsing

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

我需要一个像这样的方法:

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

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

小智 57

http://javaparser.github.io/javaparser/下载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;
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

  MethodVisitor visitor = new MethodVisitor();
  visitor.visit(cu, null);
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案很棒.谢谢,它甚至帮助人们今天;) (4认同)
  • Javac 编译器 API 在 JDK 中有一个完全可访问的解析 API。这有点复杂,但是你可以获取系统编译器(`ToolProvider.getSystemJavaCompiler()`),通过`compiler.getTask(...)`获取它的`JavacTask`,并通过`task.parse()解析它`,它返回 `CompilationUnitTree` 的集合。Sun/Oracle 解析器实际上比 ECJ 解析器快得多,尽管它不具有 ECJ 所具有的相同级别的错误推断能力(例如,ECJ 可以就您的意思提供建议,或者部分解析您所需要的代码) “大部分”是正确的)。 (4认同)
  • 很好的答案.感谢努力.谢谢. (3认同)
  • 该项目维护于https://github.com/javaparser/javaparser,几周前我们发布了2.1版(完全支持Java 8).请享用! (3认同)
  • 该项目已不再维护.查看http://code.google.com/p/javaparser/issues/detail?id=9#c32,它会引导您访问https://github.com/matozoid/javaparser (2认同)

Fel*_*old 7

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