私は以下の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 から、 TypeDeclaration のリストを返すメソッド getTypes を使用して、上位の型を取得できます (内部クラスは取得できません)。TypeDeclaration は、クラス、インターフェイス、または列挙型のいずれかです。TypeDeclaration には、宣言された型の名前を取得するために使用できるメソッド getName があります。その後、TypeDeclaration のメンバーに問い合わせて、内部クラス、メソッド、またはフィールドを探すことができます。
ツリーをナビゲートする他の 2 つの方法は次のとおりです。 * ビジターを使用する *すべてのノードで使用可能なメソッド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 プロジェクトの貢献者です