2015-08-24 88 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

感谢您的回答。 对于我上面的代码,我仍然无法解析字段名称。 你能帮我吗? –