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

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

IDE可以自动重构、自动生成一些代码、自动对不规范代码发出警告。这是很强很实惠的功能。一个大型软件项目常常有几百人合作,几百万行代码。很多代码规范难以百分百落实,很多编程错误潜藏在项目中。这时候我们会考虑Sonar, FindBug, Checkstyle之类的代码分析工具来帮助我们扫描出巨量代码中存在的问题。国内有位老兄就做了个自动生成测试代码的工具。(但不要生成功能代码,我们要构建良好的抽象和简洁的代码)我司的系统要进行架构迁移,其中有百万行代码需要修改,用人力来做是很可怕的。我做了个工具来自动完成这件事。

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

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

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

动手搞起

首先准备好库文件——打开你的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<String, String> 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

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

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

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

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

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

  3. 文本特征选择 java代码_文本分类入门(十)特征选择算法之开方检验

    前文提到过,除了分类算法以外,为分类文本作处理的特征提取算法也对最终效果有巨大影响,而特征提取算法又分为特征选择和特征抽取两大类,其中特征选择算法有互信息,文档频率,信息增益,开方检验等等十数种,这次 ...

  4. javaparser_JavaParser入门:以编程方式分析Java代码

    javaparser 我最喜欢的事情之一是解析代码并对其执行自动操作. 因此,我开始为JavaParser做出贡献,并创建了两个相关项目: java-symbol-solver和Effectiveja ...

  5. JavaParser入门:以编程方式分析Java代码

    我最喜欢的事情之一是解析代码并对其执行自动操作. 因此,我开始为JavaParser做出贡献,并创建了两个相关项目: java-symbol-solver和Effectivejava . 作为Java ...

  6. Eclipse jdt 格式化java代码

    一.概述 JDT(java development tooling)是Eclipse提供的一组API. Eclipse官方文档 Eclipse documentation maven引入:org.ec ...

  7. java modify的使用方法图解,经过JDT修改(Modify)Java代码的流程步骤

    通过JDT修改(Modify)Java代码的流程步骤 1.ICompilationUnit originalUnit = ...;// Get original compilation unit 获取 ...

  8. Lombok 安装、入门 - 消除冗长的 java 代码

    前言:     逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.     lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对 ...

  9. MongoDB最简单的入门教程之三 使用Java代码往MongoDB里插入数据

    前两篇教程我们介绍了如何搭建MongoDB的本地环境. 这篇教程我们会介绍如何使用Java代码来连接MongoDB. 如果您是基于Maven进行依赖管理的Java项目,只需要在您的pom.xml里加入 ...

最新文章

  1. 求二维数组中最大子数组的和
  2. Timer的schedule和scheduleAtFixedRate方法的区别解析
  3. 【04】AngularJS 表达式
  4. 一文抽丝剥茧带你掌握复杂Gremlin查询的调试方法
  5. poj 1287 Networking 最小生成树 Kruskal Prim
  6. cmd cd命令_Windows系统CMD命令提示符的常用命令汇总
  7. angular指令中的scope的详解
  8. MIDL2011报错。
  9. 【深度学习】初次接触
  10. Pandas实战-Series的方法
  11. 计算机软件的输出设备有哪些,计算机输出设备有哪些
  12. macOS看视频卡顿如何修复
  13. 如何锁定计算机硬盘,详细教您如何给硬盘加密
  14. word里面空白页怎么删除
  15. 安卓设备的Socket网络通讯例程 (A2) -UI界面适配
  16. IAR FOR 430出现Failed to re-intialize一种可能的解决方案
  17. 关于Kylin安装时的兼容性问题如何解决!
  18. 最新《Python 高级运维自动化开发实战大师班》
  19. MAC 下 PHPStorm 调整内存限制
  20. ad9851输出波形不理想

热门文章

  1. html双击变成可编辑状态,JS实现双击编辑可修改状态的方法
  2. 记住,在看小电影前一定要检查下域名是不是 HTTPS 的
  3. 微信 jssdk 看着文档简单总结
  4. Java向数据库中插入数据出错时怎么避免插入错误数据
  5. 基于SpringBoot的库存管理系统
  6. Instability Analysis and Oscillation Suppression of Enhancement-Mode GaN Devices--GaN半桥电路中不稳定分析
  7. Python中文社区新专栏作者计划
  8. 走向.NET架构设计—第三章—分层设计,初涉架构(后篇)
  9. 企业数字化转型是否缺少部落知识?
  10. 内网代理神奇Venom