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

这是一个关于抽象语法树(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。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaParser是一个Java语言解析器,它可以将Java代码解析为抽象语法树(AST)。使用JavaParser,您可以以编程方式分析Java代码,提取有关类、方法、变量、表达式等的信息,并执行重构、代码生成等操作。 以下是使用JavaParser分析Java代码的基本步骤: 1. 加载Java代码并创建CompilationUnit对象 ```java InputStream in = new FileInputStream("MyClass.java"); CompilationUnit cu = JavaParser.parse(in); ``` 2. 遍历AST并提取所需信息 ```java for (TypeDeclaration<?> type : cu.getTypes()) { // 找到类或接口声明 if (type.isClassOrInterfaceDeclaration()) { ClassOrInterfaceDeclaration classDecl = type.asClassOrInterfaceDeclaration(); // 提取类名 String className = classDecl.getNameAsString(); // 遍历类成员 for (BodyDeclaration<?> member : classDecl.getMembers()) { // 找到方法声明 if (member.isMethodDeclaration()) { MethodDeclaration methodDecl = member.asMethodDeclaration(); // 提取方法名 String methodName = methodDecl.getNameAsString(); // 提取方法参数和返回类型 String params = methodDecl.getParameters().toString(); String returnType = methodDecl.getType().toString(); // 执行重构或代码生成操作 // ... } } } } ``` 3. 保存修改并生成新的Java代码 ```java try (FileWriter writer = new FileWriter("MyClass_new.java")) { writer.write(cu.toString()); } ``` 以上是JavaParser的基本用法,您可以根据自己的需求进行进一步的学习和探索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值