【问题标题】:JavaParser how to get classname in CompilationUnitJavaParser如何在CompilationUnit中获取类名
【发布时间】:2020-12-20 05:02:45
【问题描述】:

我有一个 .java 类的路径,比如“./src/module/car.java”,我像这样解析它:

File sourceFileCar = new File("./src/module/car.java");
CompilationUnit cuCar = StaticJavaParser.parse(sourceFileCar);

如何在不知道car.java文件的情况下获取类名(不能使用cuCar.getClassByName)

【问题讨论】:

  • 没有使用过JavaParser,但looking at the API 似乎您想使用#getType(int)#getTypes() 来获取TypeDeclaration,然后您可以调用#getFullyQualifiedName()#getName() on,具体取决于您是否需要完全限定名称或简单名称。
  • 您必须使用getTypes() 并对其进行迭代,因为编译单元(即源文件)可以包含多个顶级类型/类。您可能认为它只有一个,因为javac 编译器每个编译单元只接受一个public 顶级类,但一个可以有任意数量的非公共类。

标签: java parsing javaparser


【解决方案1】:

要访问解析后的文件,您必须创建一个扩展 VoidVisitorAdapter 类的访问者类。

public static class ClassNameCollector extends VoidVisitorAdapter<List<String>>{
    @Override
    public void visit(ClassOrInterfaceDeclaration n, List<String> collector) {
        super.visit(n, collector);
        collector.add(n.getNameAsString());
    }
}

创建类后,你必须重写 visit() 方法,该方法是访问解析文件中的节点。在这种情况下,我们使用 ClassOrInterfaceDeclaration 作为方法参数来获取类名并传递 List 用于收集名称。

在主类中,创建一个访问者对象,使用visit()获取编译对象和列表作为参数。

public static void main(String[] args) throws Exception {
    List<String> className = new ArrayList<>();
    // Create Compilation.
    CompilationUnit cu = StaticJavaParser.parse(new File(FILE_PATH));
    // Create Visitor.
    VoidVisitor<List<String>> classNameVisitor = new ClassNameCollector();
    // Visit.
    classNameVisitor.visit(cu,className);
    // Print Class's name
    className.forEach(n->System.out.println("Class name collected: "+n));
}

结果如下所示。

Class name collected: InvisibleClass
Class name collected: VisibleClass
Class name collected: ReversePolishNotation

希望这能解决你的问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多