AST 语法入门

以前使用 Lombok 一直觉得是一个很棒的设计,可以同时兼顾注解的遍历和运行的性能。

运行时注解一直因为性能问题被人诟病。

自己尝试写过一些框架,但是耗费了比较多的精力,因为 AST 语法不是很熟悉,所以准备整一个系列,入门学习下 AST 语法。

AST(Abstract syntax tree) 抽象语法树

AST是javac编译器阶段对源代码进行词法语法分析之后,语义分析之前进行的操作。

用一个树形的结构表示源代码,源代码的每个元素映射到树上的节点。

java 编译时的三个阶段

Java源文件->词法,语法分析-> 生成AST ->语义分析 -> 编译字节码,二进制文件。

通过操作 AST 可以实现 java 源代码的功能。

Rewrite、JavaParser 等开源工具可以帮助你更简单的操作AST。

所有源文件会被解析成语法树。

调用注解处理器。如果注解处理器产生了新的源文件,新文件也要进行编译。

最后,语法树会被分析并转化成类文件。

个人愿景

通过学习 AST 和 javaParser 等优秀框架的精华,提炼一个可以非常方便生成 class 文件的工具。

思路

源文件==》拓展后的文件==》AST 语法树==》class 文件覆盖

其他

后续学习下 java-sandbox 的思想和实现方式,拓展一下 AOP 的实现种类。

灵活强大。

拓展阅读

ASM

java 源码

参考资料

java AST 表达式_java 编译时注解-AST 抽象语法树简介相关推荐

  1. 【转】抽象语法树简介(AST)

    引用地址:http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstract syntax code ...

  2. java 取消引用_java编译时所说的“无法取消引用”是什么意思

    部分代码如下:publicabstractclassAnimal//animal类定义为抽象类{publicstaticfinalbooleanisMammal=false;publicstaticf ...

  3. java抽象语法树_抽象语法树AST的全面解析(一)

    Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...

  4. AST(抽象语法树)超详细

    自己研究的东西会用到AST,就自己通过查阅资料,整理一下. 本文目录 第一部分:AST的作用 第二部分:AST的流程 第三部分: Eclipse AST的获取与访问 第一部分:AST的作用 首先来一个 ...

  5. Java解析SQL生成语法树_04. Hive源码 — HQL解析(抽象语法树的生成和语义分析)

    HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码. 1. compile中的主要内容 public int compile(String command, boo ...

  6. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

    文章目录 一.ASTTransformation#visit 方法简介 二.org.codehaus.groovy.ast.ModuleNode 脚本节点 一.ASTTransformation#vi ...

  7. java编译时注解_简单介绍 Java 中的编译时注解

    1. 前言 上一篇 主要介绍了什么是 注解 (Annotation) 以及如何读取 运行时注解 中的数据, 同时用注解实现了简单的 ORM 功能. 这次介绍另一部分: 如何读取 编译时注解 ( Ret ...

  8. 3. 自定义Java编译时注解处理器

    1. 絮絮叨叨 要么是注解跟我有仇,要么是公司配发的笔记本跟我有仇,要么是因为心急吃不了热豆腐 痛定思痛:从头开始,新建一个Java项目,实现一个超级简单的注解@Hello 通过获取被标识类的类名(原 ...

  9. java可以在类中直接定义语句_基于javac实现的编译时注解

    很多同学都知道jdk中有一个很重要的jar : tools.jar,但是 很少有人知道这个包里面究竟有哪些好玩的东西. javac入口及编译过程 在使用javac命令去编译源文件时,实际上是去执行co ...

最新文章

  1. html显示三维模型restful,返回带有Flask Restful的呈现模板,在浏览器中显示HTML
  2. 基于cocos2d-x的快速的游戏开发--回合制游戏
  3. AI:《Why is DevOps for Machine Learning so Different?—为什么机器学习的 DevOps 如此不同?》翻译与解读
  4. 传统APP与微信端APP十大优劣对比
  5. oracle数据库配置助手来初始化参数,使用服务器参数文件(SPFILE)管理初始化参数...
  6. python爬虫程序的流程图_Python即时网络爬虫项目: 内容提取器的定义(Python2.7版本)...
  7. JAVA入门学习 —数组排序的方法
  8. 仙剑奇侠传五破解方法(虚拟机版)
  9. Dhtmlx Gantt 快速入门至精通
  10. 【洋桃电子】STM32入门100步-01
  11. 两栏 论文首页 插尾注方法 word2019
  12. 警惕!关于5G的最新骗局!
  13. author-头文字注释
  14. matlab logpolar,GitHub - luxinjin/polar-code: matlab simulation for polar code
  15. OpenSSL公钥 私钥 RSA
  16. mysql 时间函数的使用
  17. 把文件放在服务器上以供用户下载
  18. 那些可盐可甜的AI声音,可能都是出自于这家公司
  19. git-bash.exe和git-cmd.exe运行Git的区别
  20. 【经验】申请联合培养博士出国

热门文章

  1. 【ACE Meetup天津站】云计算时代的运维管理
  2. vscode+MinGW+cmake设置轻量ide
  3. 有用的SAP System Administration T-CODE
  4. Vim 快捷键整理【转】
  5. 6.3 Spring Boot集成mongodb开发
  6. AtCoder Beginner Contest 022 A.Best Body 水题
  7. 可在广域网部署运行的QQ高仿版 -- GG叽叽(开源)
  8. 微软陆续更新Win8应用 否认靠金钱争取开发者
  9. Windows 7官方主题之“海上航行”
  10. postfix管理邮件队列的小程序