java - 使用 Java 解析器从 Java 文件中解析属性

标签 java javaparser

我在下面有 3 个类。

public class A {
     B b;
}

public class B {
    C c;

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

public class C {

}

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

  • 类名
  • 方法名称
  • 属性名称

最佳答案

我建议您从 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,代表文件的所有内容。您只需要浏览这棵树并提取信息。

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

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

要使用访问者模式,请检查包 visitor在 JavaParser 中:已经有几个要扩展的抽象访问者。创建访问者后,您可以使用 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 项目的贡献者

关于java - 使用 Java 解析器从 Java 文件中解析属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178349/

相关文章:

Javaparser:用一种方法访问所有节点类型

java - 有没有一种方法可以获取方法中的所有语句,而无需手动遍历 AST

java - hibernate c3p0 ThreadPoolExecutor 连接池,我做对了吗?

java - 如何提取分支决策的 boolean 值?

java - .java 报告生成、方法调用者和被调用者

java - 拥有大量(20+)简单线程是否有危险?

java - 如何使用 javaparser 获取类级变量声明?

java - onClick takeScreenShot 导致暂停

java - 如何使用Hbase的RowCounter类获取表中的行数?

java - Java 中的基本 Array[] 树数据结构