簡體   English   中英

Java:如何使用JavaParser獲取Java類的標識符數量

[英]Java: how to use JavaParser to get number of identifiers of a Java class

我想使用JavaParser來獲取Java類具有的標識符數量。

我下載了JavaParser jar文件並將其添加到我的項目中,然后,我遵循了其中的一些說明,現在我可以以編程方式解析一些Java類,並使用ClassOrInterfaceDeclaration方法,例如.getMethods() .getMembers()等。 。

現在,我想知道如何獲取每個類中的標識符數量。 沒有.getIdentifiers()方法,那么我應該采用哪種方法?

如果閱讀javaparser-corejavadoc ,則會發現JavaParser.parse(...)返回CompilationUnit ,它是AST(抽象語法樹)中的Node

可以遍歷AST,例如使用walk(Consumer<Node> consumer)

這是一個程序,它將遍歷先前在注釋中發布的AST,並打印所有節點。 如果有一個,它將打印節點的標識符

import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.nodeTypes.NodeWithIdentifier;

public class Test {
    public static void main(String[] args) throws Exception {
        String javaSource = "class MyClass {" +
                            "  void main(String[] args) {" +
                            "    int a = 5, b = 6;" +
                            "    int c = a * b;" +
                            "    System.out.println(c);" +
                            "  }" +
                            "}";

        System.out.printf("%-28s %-12s %s%n", "Node.class.simpleName", "Identifier", "Node.toString()");
        System.out.printf("%-28s %-12s %s%n", "=====================", "==========", "===============");
        JavaParser.parse(javaSource).walk(node -> {
            String identifier = "";
            if (node instanceof NodeWithIdentifier)
                identifier = ((NodeWithIdentifier<?>) node).getIdentifier();
            System.out.printf("%-28s %-12s %s%n",
                              node.getClass().getSimpleName(),
                              identifier,
                              node.toString().replaceFirst("(?s)\\R.*", "..."));
        });
    }
}

產量

Node.class.simpleName        Identifier   Node.toString()
=====================        ==========   ===============
CompilationUnit                           class MyClass {...
ClassOrInterfaceDeclaration               class MyClass {...
SimpleName                   MyClass      MyClass
MethodDeclaration                         void main(String[] args) {...
SimpleName                   main         main
Parameter                                 String[] args
ArrayType                                 String[]
ClassOrInterfaceType                      String
SimpleName                   String       String
SimpleName                   args         args
VoidType                                  void
BlockStmt                                 {...
ExpressionStmt                            int a = 5, b = 6;
VariableDeclarationExpr                   int a = 5, b = 6
VariableDeclarator                        a = 5
PrimitiveType                             int
SimpleName                   a            a
IntegerLiteralExpr                        5
VariableDeclarator                        b = 6
PrimitiveType                             int
SimpleName                   b            b
IntegerLiteralExpr                        6
ExpressionStmt                            int c = a * b;
VariableDeclarationExpr                   int c = a * b
VariableDeclarator                        c = a * b
PrimitiveType                             int
SimpleName                   c            c
BinaryExpr                                a * b
NameExpr                                  a
SimpleName                   a            a
NameExpr                                  b
SimpleName                   b            b
ExpressionStmt                            System.out.println(c);
MethodCallExpr                            System.out.println(c)
FieldAccessExpr                           System.out
NameExpr                                  System
SimpleName                   System       System
SimpleName                   out          out
SimpleName                   println      println
NameExpr                                  c
SimpleName                   c            c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM