资讯专栏INFORMATION COLUMN

Java编译期优化思维导图

sorra / 2671人阅读

摘要:本文参考自来自周志明深入理解虚拟机第版,拓展内容建议读者可以阅读下这本书。和构造方法一一对应,是同一概念在两个级别的含义收敛的操作自动保证执行父类的执行语句块初始化类变量字符串加操作替换为或的操作

本文参考自来自周志明《深入理解Java虚拟机(第2版)》,拓展内容建议读者可以阅读下这本书。

文字版如下:

编译期优化 javac的编译过程 解析和填充符号表

解析 Parse

词法分析

源代码字符流 -> 标记Token

源代码字符是程序编写的最小单位,Token是编译过程的最小元素不可再分

语法分析

Token序列 -> 抽象语法树AST

AST描述代码语法结构的树状结构,每个节点表示一个语法结构(包、类型、修饰符、运算符、接口、返回值、注释等)

填充符号表 Enter

符号表 -> 待处理列表To Do list

符号表symbol table是由一组符号地址和符号信息构成的表

包、类、方法、字段都可以抽象成一个符号(symbol),不同种类的符号之间可以有包含嵌套关系,这一阶段的任务就是识别出各类符号,并对不同种类的符号按照包含嵌套关系进行归类,并挂接到AST对应的结点上。

插入式注解处理器的注解处理

使用JDK1.6后提供的插入式注解标准API来开发,这些API用于读取、修改、添加语法树的元素,运行时使用-processor参数来参与javac的编译

插入式注解处理器起编译期插件作用

在编译期间插入式注解处理器对注解进行处理,可以读取、修改、添加语法树的元素

如果处理过程中修改了语法树将会触发编译期回到填充符号表阶段重新处理一轮(Round),直到语法树不再变化

实例:lombok,在设置了相关注解后lombok会在编译期生成源代码中没有的方法等

分析与字节码生成

语义分析

标注检查

变量使用前是否已经被声明

变量与赋值之间的数据类型是否能够匹配

常量折叠

数据及控制流检查

程序局部变量在使用前是否有赋值

方法的每条路径是否都有返回值

是否所有的受检异常都被正确处理

final参数、final局部变量是否被修改

局部变量是否用final修饰最终在class文件中是无差别的,因为局部变量在class中是没有访问标志的,这个final不变性只在编译期检查时保证

解语法糖

泛型:编译后发生类型擦除,但是编译信息会保留Signature

变长参数:编译后变成数组类型的参数

自动装箱拆箱:编译后装箱通过valueOf()变成了对象,拆箱通过xxxValue()变成了原始类型值

遍历循环:编译后变成了迭代器遍历

条件编译:编译后将常量不可达条件分支直接消除掉

内部类

枚举类

断言

switch处理枚举和字符串

try定义和关闭资源

字节码生成

处理完的语法树和符号表 -> 字节码

少量的代码添加和转换工作

添加()和()方法

()收敛的操作

调用父类的()

执行{}语句块

初始化实例变量

()是字节码级别的方法,对使用者是透明的,与每个()对应的构造方法是源码级别的方法,是真正被使用者开放的。()和构造方法一一对应,是同一概念在两个级别的含义

()收敛的操作

(JVM自动保证执行父类的())

执行static{}语句块

初始化类变量

字符串加操作替换为StringBuffer或StringBuilder的append()操作

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76943.html

相关文章

  • ❤️导图整理大厂面试高频数组8: 移除元素的双指针优化, 力扣27❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关...

    zhangyucha0 评论0 收藏0
  • Java多线程学习(三)volatile关键字

    摘要:三关键字能保证原子性吗并发编程艺术这本书上说保证但是在自增操作非原子操作上不保证,多线程编程核心艺术这本书说不保证。多线程访问关键字不会发生阻塞,而关键字可能会发生阻塞关键字能保证数据的可见性,但不能保证数据的原子性。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchroniz...

    tain335 评论0 收藏0
  • ❤️思维导图整理大厂面试高频数组10: 3种方法彻底解决中位数问题, 力扣4❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关...

    XanaHopper 评论0 收藏0
  • ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣1

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关...

    刘福 评论0 收藏0
  • 一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构

    摘要:前言本文内容讲解的内容一张思维导图辅助你深入了解源码架构。总结以上内容是笔者最近学习源码时的收获与所做的笔记,本文内容大多是开源项目技术揭秘的内容,只不过是以思维导图的形式来展现,内容有省略,还加入了笔者的一点理解。1.前言 本文内容讲解的内容:一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构。 项目地址:github.com/biaochenxuy… 文...

    weij 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<