Eclipse JDT--ASTParser使用

创建ASTParser并将Java源文件解析成AST:

[java]  view plain  copy
  1. // Initialize ASTParser  
  2.         ASTParser parser = ASTParser.newParser(AST.JLS3); //initialize    
  3.         parser.setKind(ASTParser.K_COMPILATION_UNIT);     //to parse compilation unit  
  4.         parser.setSource(content.toCharArray());          //content is a string which stores the java source  
  5.         parser.setResolveBindings(true);  
  6.         CompilationUnit result = (CompilationUnit) parser.createAST(null);  

 

调用imports()方法得到源文件的一系列import声明:

[java]  view plain  copy
  1. //show import declarations in order  
  2.         List importList = result.imports();    
  3.         System.out.println("import:");  
  4.         for(Object obj : importList) {  
  5.             ImportDeclaration importDec = (ImportDeclaration)obj;  
  6.             System.out.println(importDec.getName());  
  7.         }  

 

 

调用types()方法得到类名称:

扫描二维码关注公众号,回复: 1656804 查看本文章
[java]  view plain  copy
  1. //show class name  
  2.         List types = result.types();    
  3.         TypeDeclaration typeDec = (TypeDeclaration) types.get(0);   
  4.         System.out.println("className:"+typeDec.getName());  

 

调用TypeDeclaration的getField方法得到类里定义的field:

[java]  view plain  copy
  1. //show fields  
  2.         FieldDeclaration fieldDec[]=typeDec.getFields();  
  3.         System.out.println("Fields:");  
  4.         for(FieldDeclaration field: fieldDec)  
  5.         {  
  6.             System.out.println("Field fragment:"+field.fragments());  
  7.             System.out.println("Field type:"+field.getType());  
  8.         }  

 

 

调用TypeDeclaration的getMethods方法得到类里定义的list of methods;同理,可以调用MethodDeclaration里的各种方法得到method的方法名,参数,返回类型等等:

[java]  view plain  copy
  1. //show methods  
  2.         MethodDeclaration methodDec[] = typeDec.getMethods();    
  3.         System.out.println("Method:");    
  4.         for (MethodDeclaration method : methodDec)    
  5.         {    
  6.             //get method name  
  7.             SimpleName methodName=method.getName();  
  8.             System.out.println("method name:"+methodName);  
  9.               
  10.             //get method parameters  
  11.             List param=method.parameters();  
  12.             System.out.println("method parameters:"+param);  
  13.               
  14.             //get method return type  
  15.             Type returnType=method.getReturnType2();  
  16.             System.out.println("method return type:"+returnType);  

 

 

一个方法的内容对应一个block,可以用getBody()得到;一个block又可以被分解成一系列statements,可以用statements()方法得到:

[java]  view plain  copy
  1. //get method body  
  2.             Block body=method.getBody();  
  3.             List statements=body.statements();   //get the statements of the method body  
  4.             Iterator iter=statements.iterator();  
  5.             while(iter.hasNext())  
  6.             {  
  7.                 //get each statement  
  8.                 Statement stmt=(Statement)iter.next();  

 

接下来需要根据每个statement的类型来对源码进行相应的解析。Statement有很多子类,这里只给出其中的几类介绍(具体可以参考我上一篇文章:ASTParser介绍;最好直接去Eclipse documentation官网查看相关文档)。基本流程就是先判断statement是哪种类型的实例,做出相应的ClassCast,再调用相应的方法。

 

1. ExpressionStatement (又包括Assignement, MethodInvocation等子类)。

[java]  view plain  copy
  1. if(stmt instanceof ExpressionStatement)  
  2.                 {  
  3.                     ExpressionStatement expressStmt=(ExpressionStatement) stmt;  
  4.                     Expression express=expressStmt.getExpression();  
  5.                       
  6.                     if(express instanceof Assignment)  
  7.                     {  
  8.                         Assignment assign=(Assignment)express;  
  9.                         System.out.println("LHS:"+assign.getLeftHandSide()+"; ");  
  10.                         System.out.println("Op:"+assign.getOperator()+"; ");  
  11.                         System.out.println("RHS:"+assign.getRightHandSide());  
  12.                           
  13.                     }  
  14.                     else if(express instanceof MethodInvocation)  
  15.                     {  
  16.                         MethodInvocation mi=(MethodInvocation) express;  
  17.                         System.out.println("invocation name:"+mi.getName());  
  18.                         System.out.println("invocation exp:"+mi.getExpression());  
  19.                         System.out.println("invocation arg:"+mi.arguments());  
  20.                           
  21.                     }  
  22.                     System.out.println();  
  23.                       
  24.                 }  

 

 

 

2. IfStatement

[java]  view plain  copy
  1. else if(stmt instanceof IfStatement)  
  2.                 {  
  3.                     IfStatement ifstmt=(IfStatement) stmt;  
  4.                     InfixExpression wex=(InfixExpression) ifstmt.getExpression();  
  5.                     System.out.println("if-LHS:"+wex.getLeftOperand()+"; ");  
  6.                     System.out.println("if-op:"+wex.getOperator()+"; ");  
  7.                     System.out.println("if-RHS:"+wex.getRightOperand());  
  8.                     System.out.println();  
  9.                 }  

 

3. VariableDeclarationStatement

[java]  view plain  copy
  1. else if(stmt instanceof VariableDeclarationStatement)  
  2.                 {  
  3.                     VariableDeclarationStatement var=(VariableDeclarationStatement) stmt;  
  4.                     System.out.println("Type of variable:"+var.getType());  
  5.                     System.out.println("Name of variable:"+var.fragments());  
  6.                     System.out.println();  
  7.                       
  8.                 }  

 

4. ReturnStatement

[java]  view plain  copy
  1. else if(stmt instanceof ReturnStatement)  
  2.                 {  
  3.                     ReturnStatement rtstmt=(ReturnStatement) stmt;  
  4.                     System.out.println("return:"+rtstmt.getExpression());  
  5.                     System.out.println();  
  6.                 }  

 

 

ASTParser 作为programming language编译器的一部分,功能机制可以说是相当强大。以上的例子只是冰山一角。使用ASTParser可以对java的源文件进行各种解析,用户只需要指明源文件,调用一下ASTParser的createAST方法就能得到完整的AST了,剩下的就是用户根据实际需要对AST进行各种manipulate了。

猜你喜欢

转载自blog.csdn.net/weixin_36431280/article/details/80717304
今日推荐