JavaParser 如何在 CompilationUnit 中获取类名

问题描述 投票:0回答:2

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

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

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

java parsing javaparser
2个回答
2
投票

要访问已解析的文件,您必须创建一个扩展 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

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


0
投票

扩展色拉和绍尔评论:

//Primary Name
if (cuCar.getPrimaryTypeName().isPresent()) {
    System.out.println("\nClass Name: " + cuCar.getPrimaryTypeName().get());
}

//All class names (since a Java file can have multiple classes)
System.out.println(cuCar.getTypes().size());
for (TypeDeclaration<?>  name_class : cuCar.getTypes()) {
    System.out.println(name_class.getName());
}
© www.soinside.com 2019 - 2024. All rights reserved.