Java代码分析器(⼀):JDT⼊门
这是⼀个关于抽象语法树(Abstract Syntax Tree, AST)的故事。
抽象语法树是对程序代码的结构化表⽰,是对代码进⾏词法分析、语法分析后得到的产物。编译器要⽤到它,很多⽣产⼒⼯具也要⽤它,例如:
IDE可以⾃动重构、⾃动⽣成⼀些代码、⾃动对不规范代码发出警告。这是很强很实惠的功能。
⼀个⼤型软件项⽬常常有⼏百⼈合作,⼏百万⾏代码。很多代码规范难以百分百落实,很多编程错误潜藏在项⽬中。这时候我们会考虑Sonar, FindBug, Che ckstyle之类的代码分析⼯具来帮助我们扫描出巨量代码中存在的问题。
国内有位⽼兄就做了个⾃动⽣成测试代码的⼯具。(但不要⽣成功能代码,我们要构建良好的抽象和简洁的代码)
我司的系统要进⾏架构迁移,其中有百万⾏代码需要修改,⽤⼈⼒来做是很可怕的。我做了个⼯具来⾃动完成这件事。
甚⾄⾃动写代码也不是不可能。那么我们⾃⼰能玩⼀玩AST这种⾼它们利⽤AST来对⼤量程序代码做⾃动化处理,给了我们莫⼤的帮助。甚⾄⾃动写代码也不是不可能
⼤上的东西吗?
能。Eclipse这个开源的Java IDE就提供了⼀个库来帮助我们达到⽬的,它的名字是JDT(Java Development Tools)。我们使⽤它的核⼼模块JDT Core。
这个东西提供了⼀套关于AST的API,能解析Java代码,⽣成、分析和操作AST结构。有了它,我们就不⽤⾃⼰实现⾼难度的词法分析和语法分析了。
动⼿搞起
⾸先准备好库⽂件——打开你的Eclipse安装⽬录,在搜索框中搜索以下jar⽂件(*是通配符): _*
先来溜⼀段起步代码,把⼀段Java代码解析成AST。
import java.util.Map;
dom.*;
lipse.jdt.JavaCore;
......
public static void main(String[] args) {
ASTParser parser = wParser(AST.JLS4); //设置Java语⾔规范版本
parser.setKind(ASTParser.K_COMPILATION_UNIT);
Map<String, String> compilerOptions = Options();
compilerOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7); //设置Java语⾔版本
java编译器ide最新版下载
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) ateAST(null); //这个参数是IProgessMonitor,⽤于GUI的进度显⽰,我们不需要,填个null. 返回值是AST的根结点
System.out.println(cu); //把AST直接输出看看啥样
}
AST作为抽象语法树,它就是⼀棵树,有点像XML的DOM树。例⼦中的树⼤概长这样:
CompilationUnit |
class
| |
A method1
| | |
void [] {}
| |
arg ;
| |
int b
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论