概述

在阅读深入理解java虚拟机这本书时,觉得作者写得很好,看了有很多收获,同时也发现了一个问题,就是作者并没有完整的按照一个java程序从java文件到最后运行结束做出一个整体的分析。

事实是一般java程序员做的开发工作往往仅局限于java文件,即写java代码本身。那么一个java文件从写好开始,会经历哪些过程呢?我想借由这篇文章来做一个大致梳理。

编译

由java程序员写好后的代码是存放在一个个的java文件。那么第一步就是把这个java文件编译成一个class文件。

然而事实上编译期在java里面远远不止是这么简单。java语言的编译期是一段不确定的过程,包括

 

  • 编译器的前端。把java文件转变成class文件。
  • 后段运行期编译。JIT编译器,把字节码转变成机器码的过程。
  • 静态提前编译。AOT编译期,直接把java文件编译成本地机器代码。

编译过程大致可以分为三个过程:

 

  • 解析与填充符号表过程
  1. 词法,语法解析
  2. 填充符号表
  • 插入式注解处理器的注解处理过程
  • 分析与字节码生成过程
  1. 标注检查
  2. 数据及控制流分析
  3. 解语法糖
  4. 字节码生成

加载

把描述类的数据从Class文件(已经编译成Class文件了)加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.

.class文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载

解释或编译运行class中的字节码指令

一些问题

1.假设一个java文件有5个类,编译后有几个class文件?

答:有几个类就有几个Class文件