使用Java Parser从Java文件中解析属性

时间:2015-08-24 09:05:45

标签: java javaparser

我下面有3节课。

public class A {
     B b;
}

public class B {
    C c;

    public C getC() {
        A a;
        return c;
    }
}

public class C {

}

我想使用具有以下信息的java解析器解析类:

  • 班级名称
  • 方法名称
  • 属性名称

1 个答案:

答案 0 :(得分:2)

我建议你从GitHub上最新版本的JavaParser开始:https://github.com/javaparser/javaparser

您可以使用Maven轻松创建项目,并在JavaParser依赖项中包含:

  <dependency>
      <groupId>com.github.javaparser</groupId>
      <artifactId>javaparser-core</artifactId>
      <version>2.2.1</version>
  </dependency>

然后解析文件非常简单:

 File sourceFile = new File("path/to/my/file.java");
 CompilationUnit compilationUnit = JavaParser.parse(sourceFile);

JavaParser返回抽象语法树的根节点,它是CompilationUnit并表示文件的所有内容。您只需要导航此树并提取信息。

例如,从CompilationUnit中,您可以使用方法getTypes获取顶级类型(但不是内部类),这将返回TypeDeclaration的列表。 TypeDeclaration可以是类,接口或枚举。 TypeDeclaration具有getName方法,您可以使用该方法获取声明类型的名称。然后,您可以向成员询问TypeDeclaration并查找内部类,方法或字段。

导航树的其他两种方法是:  *使用访客  *使用每个节点上可用的方法getChildrenNodes(CompilationUnit,TypeDeclaration,方法声明,语句等)

要使用访问者模式,请检查JavaParser中的包visitor:已经有几个抽象访问者要扩展。创建访问者后,您只需使用compilationUnit.accept(myVisitor, <extra arg>);调用它,它就会抓取整个树。

如果你想使用getChildrenNodes,你可以沿着这些方向做点什么:

void processNode(Node node) {
   if (node instanceof TypeDeclaration) {
      // do something with this type declaration
   } else if (node instanceof MethodDeclaration) {
      // do something with this method declaration
   } else if (node instanceof FieldDeclaration) {
      // do something with this field declaration
   }
   for (Node child : node.getChildrenNodes()){
      processNode(child);
   }
}

...
CompilationUnit cu = JavaParser.parse(sourceFile);
processNode(node);
...

希望它有所帮助,如果您有其他特定于JavaParser的问题,请随时open an issue或加入JavaParser chat

免责声明:我是JavaParser项目的撰稿人