3

私は以下の3つのクラスを持っています。

public class A {
     B b;
}

public class B {
    C c;

    public C getC() {
        A a;
        return c;
    }
}

public class C {

}

次の情報を持つJavaパーサーを使用してクラスを解析したい:

  • クラス名
  • メソッド名
  • 属性名
4

1 に答える 1

3

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 プロジェクトの貢献者です

于 2015-08-25T22:33:10.427 に答える