JavaParser 如何在 CompilationUnit 中获取类名

JavaParser how to get classname in CompilationUnit

我有一条通往 .java class 的路径,例如“./src/module/car.java”,我这样解析它:

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

如何在 car.java 文件中获取 class 名称而不事先知道它(不能使用 cuCar.getClassByName)

要访问已解析的文件,您必须创建一个访问者 class 来扩展 VoidVisitorAdapter class.

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

创建 class 后,您必须覆盖 visit() 方法,该方法的工作是访问已解析文件中的节点。在这种情况下,我们使用ClassOrInterfaceDeclaration作为方法参数来获取class名称并通过List收集名称。

在主体class中,创建访问者对象以使用 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

希望这可以解决您的问题:)