2015-08-24 125 views
1

我有3個類以下。使用Java解析器從Java文件解析屬性

public class A { 
    B b; 
} 

public class B { 
    C c; 

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

public class C { 

} 

我想使用具有以下信息Java解析器解析類:

  • 類名
  • 方法名
  • 屬性名稱
+0

那麼,嗯,這樣做。此外,將是什麼分析器實現? – fge

+0

我想使用Java Parser(Japa Parser)。 來源鏈接: https://code.google.com/p/javaparser/wiki/UsingThisParser –

回答

2

我建議你從開始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方法可以用來獲取聲明類型的名稱。然後,您可以請求類型聲明的成員並查找內部類,方法或字段。

其他兩種方式來瀏覽樹是: *使用方法getChildrenNodes它可在每個節點上(CompilationUnit,TypeDeclaration,方法的聲明,聲明等)

要使用訪問者模式利用遊客 *在JavaParser中檢查包visitor:已經有幾個抽象訪問者可以擴展。一旦你創建了你的訪問者,你可以使用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問題隨意open an issue或加入JavaParser chat

聲明:我是JavaParser項目的貢獻者

+0

感謝您的回答。 對於我上面的代碼,我仍然無法解析字段名稱。 你能幫我嗎? –