我想使用JavaParser来获取java类所具有的标识符数量。
我下载了JavaParser jar文件并将其添加到我的项目中,然后,我遵循了一些these指令,现在我能够以编程方式解析一些Java类并使用ClassOrInterfaceDeclaration
中的方法,如{{ 1}},.getMethods()
等......
现在,我想知道如何获得每个类中的标识符数量。没有.getMembers()
方法,我应该采取什么方法?
答案 0 :(得分:3)
如果您阅读javadoc的javaparser-core
,您会发现JavaParser.parse(...)
返回CompilationUnit
,这是AST中的Node
(抽象语法树)。
可以遍历AST,例如使用walk(Consumer<Node> consumer)
。
这是一个程序,它将遍历source previously posted in a comment的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