1. 词法、语法分析和填充符号表

1.1 词法分析:将源代码的字符流转为Token集合,关键字、变量名、字面量和运算符都可成为Token,比如代码“int i = a + 2”,那么int, i, =, a, +, 2这六个都是Token。

1.2 语法分析:根据Token序列构建抽象语法树的过程,抽象语法树的各个节点是一个语法结构,如类型、修饰符以及返回值等。

1.3 填充符号表:根据信息构建一个类似键值对的表格,用于后面的语义分析阶段。

2. 注解处理

某些注解在编译期间可以修改抽象语法树的任意元素,因此,当处理注解对语法树进行了修改,编译器会重新进行词法、语法分析并填充符号表,直至注解处理结束。

3. 标注检查、数据及控制流分析和字节码生成

3.1 标注检查:经过第一和第二步得到的抽象语法树只能表示一个结构正确的源程序,但无法保证源程序符合逻辑。而标注检查会对变量使用前是否已声明、变量与赋值间的数据类型是否匹配等内容进行检查。

3.2 数据及控制流分析:会对方法是否有返回值、是否所有的受检异常都被正确处理等内容进一步验证。

3.3 解语法糖:语法糖主要是为了便于程序员代码开发的一种技术。比如常见的泛型、变长参数、增强for循环以及自动装箱、拆箱等操作。解语法糖就是为了在编译期将代码还原回普通的语法结构。

3.4 字节码生成:不仅仅将前面生成的抽象语法树、符号表转化为字节码写到磁盘里,编译器还进行了少量的代码添加和转换工作。比如我们反编译字节码文件看到的<init>()方法和<clinit>()方法,就是这个阶段添加到语法树中。

java源码编译为字节码的流程相关推荐

  1. 【Java 虚拟机原理】动态字节码技术 | Dalvik ART 虚拟机 | Android 字节码打包过程

    文章目录 一.动态字节码技术 二.Dalvik & ART 虚拟机 三.Android 字节码打包过程 总结 一.动态字节码技术 动态字节码技术 就是在 运行时 , 动态修改 Class 字节 ...

  2. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...

  3. java探针之修改类字节码文件

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...

  4. 注解、反射、动态编译、字节码操作

    注解.反射.动态编译.字节码操作 前言:本篇博客将介绍Java中注解的定义.使用以及反射对Java动态性的支持和Java字节码操作,通过本篇内容,读者将对Java知识有更加深刻的理解,同时为后面And ...

  5. Kotlin系列之Lambda编译成字节码过程完全解析

    简述: 今天带来的是Kotlin浅谈系列第七弹,上篇博客我们聊到关于Kotlin中的lambda表达式的一些语法规则和基本使用.然而我们并没有聊到Kotlin的lambda表达式的本质是什么?我们都知 ...

  6. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

    文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...

  7. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )

    文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )

    文章目录 前言 一.字段表总数据结构 二.访问标志 三.字段名称 四.字段描述符 五.属性项目数 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 三 ( 访问和修饰标志 | ...

  9. 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )

    文章目录 前言 一.访问和修饰标志 二.类索引 三.父类索引 四.接口计数器 五.接口表 六.字段计数器 七.字段表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( ...

最新文章

  1. 2020双十一实时大屏_双十一实时“战报”来了,你贡献了多少?
  2. I.MX6 Android 5.1 回到 Android 4.2 emmc 启动
  3. linux如何利用命令保存文件,如何在Linux中将命令输出保存到文件?
  4. Python 线程障碍对象 Barrier - Python零基础入门教程
  5. bzoj 2882: 工艺【SAM】
  6. Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
  7. 微信小程序怎么扩展服务器,小程序服务器可扩展的配置方案
  8. No modules named ‘tensorflow.compat.v2‘
  9. 网抑云了是什么意思,网抑云语录有哪些,网抑云网抑云梗表情包
  10. 增强型绿植植被指数_植被指数计算方法
  11. 世界各国与中国时差查询
  12. 图纸识别自动生成BOM清单的方法
  13. 崩坏3九游服务器稳定吗,崩坏3:大佬亲身经历告诉你,玩崩坏3到底该不该压等级!...
  14. 重磅上线!万兴科技旗下亿图图示12.0打造全新智能绘图体验
  15. diff函数求函数的导函数、偏导函数,及在某一点的导数、偏导数 --python
  16. 航模无人机中PWM信号频率浅谈
  17. 可拖动菜单 【总结】
  18. 计算机/软件专业课【考一门】的211学校集合!
  19. C语言编写一个简单的扫雷
  20. 拉卡拉智能POS市场发展背景及市场现状分析

热门文章

  1. 【学习笔记】SAP CO模块概念信息(下)
  2. ABAP TBL控制插入和更改
  3. 销售单据条件价格明细表
  4. 如何建立应付暂估明细查询
  5. 在alv list小计之后输出分割线
  6. 5、Power Query-抓取网页数据做漂亮的图表
  7. SAPMM模块配置目录
  8. ALV列(Column)换到行(Row) 之 列上限不固定篇
  9. 从“电商合伙人”到“品牌掌柜”,快手电商“军训”进行时
  10. python检测文件夹中新增文件_python检测文件夹变化,并拷贝有更新的文件到对应目录...