开发者社区> 技术小阿哥> 正文

jdt之java源文件解析

简介:
+关注继续查看
1、加入jdt的相关依赖

  1. <dependency> 
  2.             <groupId>org.eclipse.tycho</groupId> 
  3.             <artifactId>org.eclipse.jdt.core</artifactId> 
  4.             <version>3.6.2.v_A76_R36x</version> 
  5.         </dependency> 
  6.         <dependency> 
  7.             <groupId>org.eclipse.core</groupId> 
  8.             <artifactId>org.eclipse.core.jobs</artifactId> 
  9.             <version>3.5.0.v20100515</version> 
  10.         </dependency> 
  11.         <dependency> 
  12.             <groupId>org.eclipse.core</groupId> 
  13.             <artifactId>org.eclipse.core.contenttype</artifactId> 
  14.             <version>3.4.100.v20100505-1235</version> 
  15.         </dependency> 
  16.         <dependency> 
  17.             <groupId>org.eclipse.core</groupId> 
  18.             <artifactId>org.eclipse.core.resources</artifactId> 
  19.             <version>3.6.0.v20100526-0737</version> 
  20.         </dependency> 
  21.         <dependency> 
  22.             <groupId>org.eclipse.core</groupId> 
  23.             <artifactId>org.eclipse.core.runtime</artifactId> 
  24.             <version>3.6.0.v20100505</version> 
  25.         </dependency> 
  26.         <dependency> 
  27.             <groupId>org.eclipse.osgi</groupId> 
  28.             <artifactId>org.eclipse.osgi</artifactId> 
  29.             <version>3.6.0.v20100517</version> 
  30.         </dependency> 
原文解释为:
 
Method declaration AST node type. A method declaration is the union of a method declaration and a constructor declaration. For JLS2:
 MethodDeclaration:
    [ Javadoc ] { Modifier } ( Type | void ) Identifier (
        [ FormalParameter 
 		     { , FormalParameter } ] ) {[ ] }
        [ throws TypeName { , TypeName } ] ( Block | ; )
 ConstructorDeclaration:
    [ Javadoc ] { Modifier } Identifier (
 		  [ FormalParameter
 			 { , FormalParameter } ] )
        [throws TypeName { , TypeName } ] Block
 
For JLS3, type parameters and reified modifiers (and annotations) were added:
 MethodDeclaration:
    [ Javadoc ] { ExtendedModifier }
		  [ < TypeParameter { , TypeParameter } > ]
        ( Type | void ) Identifier (
        [ FormalParameter 
 		     { , FormalParameter } ] ) {[ ] }
        [ throws TypeName { , TypeName } ] ( Block | ; )
 ConstructorDeclaration:
    [ Javadoc ] { ExtendedModifier } Identifier (
 		  [ FormalParameter
 			 { , FormalParameter } ] )
 
3、代码样例
 

  1. import java.io.File; 
  2. import java.io.FileInputStream; 
  3. import java.io.IOException; 
  4. import java.util.List; 
  5.  
  6. import org.eclipse.jdt.core.dom.AST; 
  7. import org.eclipse.jdt.core.dom.ASTParser; 
  8. import org.eclipse.jdt.core.dom.CompilationUnit; 
  9. import org.eclipse.jdt.core.dom.FieldDeclaration; 
  10. import org.eclipse.jdt.core.dom.ImportDeclaration; 
  11. import org.eclipse.jdt.core.dom.MethodDeclaration; 
  12. import org.eclipse.jdt.core.dom.Modifier; 
  13. import org.eclipse.jdt.core.dom.PackageDeclaration; 
  14. import org.eclipse.jdt.core.dom.TypeDeclaration; 
  15. import org.eclipse.jdt.core.dom.VariableDeclarationFragment; 

  1. public static void main(String[] args) throws Exception { 
  2.       String content = read("D:\\HelloWorld.java"); //java源文件
  3.       //创建解析器  
  4.       ASTParser parsert = ASTParser.newParser(AST.JLS3); 
  5.       //设定解析器的源代码字符  
  6.       parsert.setSource(content.toCharArray()); 
  7.       //使用解析器进行解析并返回AST上下文结果(CompilationUnit为根节点)  
  8.       CompilationUnit result = (CompilationUnit) parsert.createAST(null); 
  9.  
  10.       //获取类型  
  11.       List types = result.types(); 
  12.       //取得类型声明  
  13.       TypeDeclaration typeDec = (TypeDeclaration) types.get(0); 
  14.  
  15.       //##############获取源代码结构信息#################  
  16.       //引用import  
  17.       List importList = result.imports(); 
  18.       //取得包名  
  19.       PackageDeclaration packetDec = result.getPackage(); 
  20.       //取得类名  
  21.       String className = typeDec.getName().toString(); 
  22.       //取得函数(Method)声明列表  
  23.       MethodDeclaration methodDec[] = typeDec.getMethods(); 
  24.       //取得函数(Field)声明列表  
  25.       FieldDeclaration fieldDec[] = typeDec.getFields(); 
  26.  
  27.       //输出包名  
  28.       System.out.println("包:"); 
  29.       System.out.println(packetDec.getName()); 
  30.       //输出引用import  
  31.       System.out.println("引用import:"); 
  32.       for (Object obj : importList) { 
  33.           ImportDeclaration importDec = (ImportDeclaration) obj; 
  34.           System.out.println(importDec.getName()); 
  35.       } 
  36.       //输出类名  
  37.       System.out.println("类:"); 
  38.       System.out.println(className); 
  39.       //循环输出函数名称  
  40.       System.out.println("========================"); 
  41.       System.out.println("函数:"); 
  42.       for (MethodDeclaration method : methodDec) { 
  43.          /* System.out.println(method.getName()); 
  44.           System.out.println("body:"); 
  45.           System.out.println(method.getBody()); 
  46.           System.out.println("Javadoc:" + method.getJavadoc()); 
  47.  
  48.           System.out.println("Body:" + method.getBody()); 
  49.  
  50.           System.out.println("ReturnType:" + method.getReturnType());*/ 
  51.           System.out.println("============="); 
  52.           System.out.println(method); 
  53.       } 
  54.  
  55.       //循环输出变量  
  56.       System.out.println("变量:"); 
  57.       for (FieldDeclaration fieldDecEle : fieldDec) { 
  58.           //public static  
  59.           for (Object modifiObj : fieldDecEle.modifiers()) { 
  60.               Modifier modify = (Modifier) modifiObj; 
  61.               System.out.print(modify + "-"); 
  62.           } 
  63.           System.out.println(fieldDecEle.getType()); 
  64.           for (Object obj : fieldDecEle.fragments()) { 
  65.               VariableDeclarationFragment frag = (VariableDeclarationFragment) obj; 
  66.               System.out.println("[FIELD_NAME:]" + frag.getName()); 
  67.           } 
  68.       } 
  69.   } 
  70.  
  71.   private static String read(String filename) throws IOException { 
  72.       File file = new File(filename); 
  73.       byte[] b = new byte[(int) file.length()]; 
  74.       FileInputStream fis = new FileInputStream(file); 
  75.       fis.read(b); 
  76.       return new String(b); 
  77.  
  78.   } 
运行代码:

  1. 函数: 
  2. ============= 
  3. /**  
  4.  * 测试相关类 jdt api测试 
  5.  * @param null 
  6.  * @expected 1 
  7.  */ 
  8. @Test public void test1(){ 
  9.   assertEquals(1,1); 
  10.  
  11. ============= 
  12. /**  
  13.  * 测试ignore情况 
  14.  */ 
  15. @Test @Ignore public void test2(){ 
  16.   assertEquals(1,1); 
4、结论:jdt的AST.JLS3已经满足对java method处理的需求,满足tc转换工具的使用要求。
 
5、jdt解析java文件的BlockComment、LineComment丢失


本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/615291,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JAVA对XML文件的读写(有具体的代码和解析)
XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享。 xml指令 处理指令,简称PI (processing instruction)。
1298 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29075 0
java读取资源文件的五种方式
package com.zkn.newlearn.others; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import com.zkn.newlearn.gof.singleton.SimpleFactoryTest01; /** * 读取资源文件的五种
1345 0
spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)
最近再学习spring security oauth2。下载了官方的例子sparklr2和tonr2进行学习。但是例子里包含的东西太多,不知道最简单最主要的配置有哪些。所以决定自己尝试搭建简单版本的例子。
2676 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20686 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23576 0
OAF_文件系列5_实现OAF解析XML文件javax.xml.parsers(案例)
20150729 Created By BaoXinjian 一、摘要 通过javax.xml.parsers.DocumentBuilder解析从系统系统导入的XML文件 此过程需要用到一些包方法 1.
868 0
使用 JavaScript 上传 PDF 和 Excel 等二进制文件到 ABAP 服务器并进行解析
使用 JavaScript 上传 PDF 和 Excel 等二进制文件到 ABAP 服务器并进行解析
28 0
13689
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载