我在下面有 3 节课。
public class A {
B b;
}
public class B {
C c;
public C getC() {
A a;
return c;
}
}
public class C {
}
我想使用具有以下信息的 java 解析器解析类:
- 类名
- 方法名称
- 属性名称
我在下面有 3 节课。
public class A {
B b;
}
public class B {
C c;
public C getC() {
A a;
return c;
}
}
public class C {
}
我想使用具有以下信息的 java 解析器解析类:
我建议你从 GitHub 上最新版本的 JavaParser 开始:https ://github.com/javaparser/javaparser
您可以使用 Maven 轻松创建项目,并在依赖项中包含 JavaParser:
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>2.2.1</version>
</dependency>
那么解析一个文件就很简单了:
File sourceFile = new File("path/to/my/file.java");
CompilationUnit compilationUnit = JavaParser.parse(sourceFile);
JavaParser 返回抽象语法树的根节点,它是一个 CompilationUnit,代表文件的所有内容。您只需要浏览这棵树并提取信息。
例如,从 CompilationUnit 中,您可以使用 getTypes 方法获取顶级类型(但不是内部类),该方法将返回TypeDeclaration列表。TypeDeclaration 可以是类、接口或枚举。TypeDeclaration 具有 getName 方法,可用于获取声明类型的名称。然后,您可以询问 TypeDeclaration 的成员并查找内部类、方法或字段。
导航树的其他两种方法是: * 使用访问者 * 使用getChildrenNodes方法,该方法在每个节点上都可用(CompilationUnit、TypeDeclaration、方法声明、语句等)
要使用访问者模式,请检查 JavaParser 中的包访问者:已经有几个抽象访问者需要扩展。一旦你创建了你的访问者,你就可以使用它来调用它compilationUnit.accept(myVisitor, <extra arg>);
,它会爬取整个树。
如果您想使用 getChildrenNodes 代替,您可以按照以下方式进行操作:
void processNode(Node node) {
if (node instanceof TypeDeclaration) {
// do something with this type declaration
} else if (node instanceof MethodDeclaration) {
// do something with this method declaration
} else if (node instanceof FieldDeclaration) {
// do something with this field declaration
}
for (Node child : node.getChildrenNodes()){
processNode(child);
}
}
...
CompilationUnit cu = JavaParser.parse(sourceFile);
processNode(node);
...
希望它有所帮助,如果您有其他特定于 JavaParser 的问题,请随时打开问题或加入JavaParser 聊天。
免责声明:我是 JavaParser 项目的贡献者