这是一个关于抽象语法树(Abstract Syntax Tree, AST)的故事。

抽象语法树是对程序代码的结构化表示,是对代码进行词法分析、语法分析后得到的产物。编译器要用到它,很多生产力工具也要用它,例如:

IDE可以自动重构、自动生成一些代码、自动对不规范代码发出警告。这是很强很实惠的功能。

一个大型软件项目常常有几百人合作,几百万行代码。很多代码规范难以百分百落实,很多编程错误潜藏在项目中。这时候我们会考虑Sonar, FindBug, Checkstyle之类的代码分析工具来帮助我们扫描出巨量代码中存在的问题。

国内有位老兄就做了个自动生成测试代码的工具。(但不要生成功能代码,我们要构建良好的抽象和简洁的代码)

我司的系统要进行架构迁移,其中有百万行代码需要修改,用人力来做是很可怕的。我做了个工具来自动完成这件事。

它们利用AST来对大量程序代码做自动化处理,给了我们莫大的帮助。甚至自动写代码也不是不可能。那么我们自己能玩一玩AST这种高大上的东西吗?

能。Eclipse这个开源的Java IDE就提供了一个库来帮助我们达到目的,它的名字是JDT(Java Development Tools)。我们使用它的核心模块JDT Core。

这个项目历史悠久,功能强力,早期开发者有《设计模式》GoF的作者。

它提供了一套关于AST的API,能解析Java代码,生成、分析和操作AST结构。有了它,我们就不用自己实现高难度的词法分析和语法分析了。

动手搞起

(嫌麻烦可以看这个小框架 https://github.com/sorra/exia)

首先准备好库文件——打开你的Eclipse安装目录,在搜索框中搜索以下jar文件(*是通配符):

org.eclipse.jdt.core_*

org.eclipse.core.contenttype_*

org.eclipse.core.jobs_*

org.eclipse.core.resources_*

org.eclipse.core.runtime_*

org.eclipse.equinox.common_*

org.eclipse.equinox.preferences_*

org.eclipse.equinox.registry_*

org.eclipse.osgi_*

org.eclipse.text_*

如果有多个版本,取最新版本。统统copy出来,添加到你的项目中。

源代码包是org.eclipse.jdt.core.source_* 用Eclipse的Attach source功能把它连到第一个jar上,可以阅读源代码。

先来溜一段起步代码,把一段Java代码解析成AST。

import java.util.Map;

import org.eclipse.jdt.core.dom.*;

import org.eclipse.jdt.JavaCore;

......

public static void main(String[] args) {

ASTParser parser = ASTParser.newParser(AST.JLS4); //设置Java语言规范版本

parser.setKind(ASTParser.K_COMPILATION_UNIT);

Map compilerOptions = JavaCore.getOptions();

compilerOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7); //设置Java语言版本

compilerOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7);

compilerOptions.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);

parser.setCompilerOptions(compilerOptions); //设置编译选项

char[] src = "class A { void method1(int b){;} }".toCharArray();

parser.setSource(src);

CompilationUnit cu = (CompilationUnit) parser.createAST(null); //这个参数是IProgessMonitor,用于GUI的进度显示,我们不需要,填个null. 返回值是AST的根结点

System.out.println(cu); //把AST直接输出看看啥样

}

AST作为抽象语法树,它就是一棵树,有点像XML的DOM树。

例子中的树大概长这样:

CompilationUnit

|

class

| |

A method1

| | |

void [] {}

| |

arg ;

| |

int b

延伸阅读:http://help.eclipse.org/ 点击JDT Plug-in User Guide -> Programmer's Guide -> JDT Core。

ast java_Java代码分析器(一): JDT入门相关推荐

  1. Java代码分析器(一): JDT入门

    这是一个关于抽象语法树(Abstract Syntax Tree, AST)的故事. 抽象语法树是对程序代码的结构化表示,是对代码进行词法分析.语法分析后得到的产物.编译器要用到它,很多生产力工具也要 ...

  2. fortify hp 价格_HP Fortify 静态代码分析器(SCA)

    检查潜伏在代码中的安全问题 Fortify 的静态代码分析器(Static Code Analyzer ,SCA)是组成Fortify 360的三个分析器之一.SCA工作在开发阶段,以用于分析应用程序 ...

  3. PMD【 Java 代码检查工具】入门使用教程(超详细)

    PMD[ Java 代码检查工具] 介绍 使用方式 1.使用插件的方式 2.maven项目引入依赖的方式 3.pmd 命令行的方式 4.Java API的方式 * 项目结构 测试代码 pmdArgs方 ...

  4. RequireJS代码文件依赖管理 - 入门篇

    使用RequireJS库,进行代码文件依赖管理 一.关键字 存在依赖.手动线性方式管理文件之间的依赖.潜在关联性 二.了解 require.js 库 简单介绍: require.js 是一款JavaS ...

  5. 100例Python代码带你从入门到进阶!

    以下所有代码全都至少运行一遍,确保可复现.易于理解.逐步完成入门到进阶的学习. 此教程经过我 反复打磨多遍 ,经常为此熬夜,真心不易,文章比较长,看完有用,帮我点个在看或分享支持. 教程包括 62 个 ...

  6. iOS(一):Swift纯代码模式iOS开发入门教程

    Swift纯代码模式iOS开发入门教程 项目初始化(修改为纯代码项目) 安装第三方库(以`SnapKit`库为例) 桥接OC库(QMUIKit) 封装视图并进行导航跳转 示例:使用 `TangramK ...

  7. 【Rust日报】2021-02-16 “火旋风”代码分析器

    "火旋风"代码分析器 作者扎克·伯恩斯发布了这款侵入式代码分析器."火旋风"分析器能帮助代码作者测试Rust代码的性能:它能分析项目中的时间敏感部分,输出到时间 ...

  8. 趣味python教程_Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...

    原标题:Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 人生苦短,编程苦手,不妨学起Python, ...

  9. Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 人生苦短,编程苦手,不妨学起Python,感受一飞冲天的快乐. 不要害怕学习的过程枯燥无味,这里有程序员jackzhenguo打造的一份中文 ...

最新文章

  1. Matlab数据的可视化 -- 条形图
  2. SAP WMSD集成之Copy WM Quantity
  3. SAP Spartacus Unit List树形数据的加载触发时机
  4. 用于基于SWT的应用程序的RichText编辑器组件
  5. [Hive]Hive的分析函数
  6. mac版本 sadptool_【Koala 工具】设备调试相关工具集锦
  7. .NET中的数据结构——表
  8. iOS开发--Swift RAC响应式编程初探
  9. 华为鸿蒙系统首发设备,鸿蒙首发设备包装曝光:安卓已成过去式,鸿蒙正式走上舞台...
  10. C# 本地图片转Base64码和Base64码显示
  11. 正宇丨人活得虚伪容易,活得真实很难
  12. Kafka 启动报错 AccessDeniedException
  13. QAOA如何在NISQ处理器中展示应用级量子优势?
  14. 【bzoj1818】[Cqoi2010]内部白点
  15. 15款jQuery幻灯片插件
  16. 问卷调查 批量模拟真人填写 爬虫 实战
  17. 大数据24小时:原微软亚洲研究院梅涛博士加盟京东,波兰计划把数字货币纳入反洗钱监管
  18. 中鑫优配热点:虚拟现实+海上风电+光伏建筑+钢铁板块
  19. 爬虫实例:从百度图片下载壁纸
  20. 万能恢复大师广告弹窗--问题解决

热门文章

  1. 99%的数据中心都会面临的痛点,现在终于有好的解决方案了!
  2. HTTP progressive download渐进式传输
  3. Lua的require使用
  4. Docker for windows 10
  5. 万能makefile深入浅出 - 第三篇
  6. Hive _偏门常用查询函数(三)附带实例(Rank)
  7. 【ElasticSearch】使用Docker安装ElasticSearch、基本增删改查使用
  8. 【jQuery】使用jquery.form.js,获取提交表单返回值
  9. MySQL(十一)视图及存储过程
  10. ChubaoFS:一个面向大规模容器平台的分布式文件系统