快捷搜索:  汽车  科技

java 查看jvm方法(深入理解JVM之Javac编译器详解)

java 查看jvm方法(深入理解JVM之Javac编译器详解)这三个步骤之间的关系和交互顺序如下图所示,可以看到如果注解处理器在处理注解期间对语法树进行了修改,编译器将回到解析和填充符号表的过程进行重新处理,直到注解处理器没有再对语法树进行修改为止。这三个步骤所做的工作内容大致如下:首先,我们先导一份 javac 的源码(基于 openjdk8)出来,下载地址:hg.openjdk.java.net/jdk8/jdk8/l…,然后将 JDK_SRC_HOME/langtools/src/share/classes/com/sun 目录下的源文件全部复制到工程的源码目录中,生成的 目录 如下:我们执行 com.sun.tools.javac.Main 的 main 方法,就和我们在命令窗口中使用 javac 命令一样:从 Sun Javac 的代码来看,编译过程大致可以分为三个步骤:

认真写文章,用心做分享。公众号:java耕耘者 文章都会在里面更新,整理的资料也会放在里面。

一、概述

我们都知道 *.java 文件要首先被编译成 *.class 文件才能被 JVM 认识,这部分的工作主要由 Javac 来完成,类似于 Javac 这样的我们称之为前端编译器

但是 *.class 文件也不是机器语言,怎么才能让机器识别呢?就需要 JVM 将 *.class 文件编译成机器码,这部分工作由JIT 编译器完成;

除了这两种编译器,还有一种直接把 *.java 文件编译成本地机器码的编译器,我们称之AOT 编译器

java 查看jvm方法(深入理解JVM之Javac编译器详解)(1)

二、javac 的编译过程

首先,我们先导一份 javac 的源码(基于 openjdk8)出来,下载地址:hg.openjdk.java.net/jdk8/jdk8/l…,然后将 JDK_SRC_HOME/langtools/src/share/classes/com/sun 目录下的源文件全部复制到工程的源码目录中,生成的 目录 如下:

java 查看jvm方法(深入理解JVM之Javac编译器详解)(2)

我们执行 com.sun.tools.javac.Main 的 main 方法,就和我们在命令窗口中使用 javac 命令一样:

java 查看jvm方法(深入理解JVM之Javac编译器详解)(3)

从 Sun Javac 的代码来看,编译过程大致可以分为三个步骤:

  • 解析和填充符号表过程
  • 插入式注解处理器的注解处理过程
  • 分析和字节码生成过程

这三个步骤所做的工作内容大致如下:

java 查看jvm方法(深入理解JVM之Javac编译器详解)(4)

这三个步骤之间的关系和交互顺序如下图所示,可以看到如果注解处理器在处理注解期间对语法树进行了修改,编译器将回到解析和填充符号表的过程进行重新处理,直到注解处理器没有再对语法树进行修改为止。

java 查看jvm方法(深入理解JVM之Javac编译器详解)(5)

Javac 编译的入口是 com.sun.tools.javac.main.JavaCompiler 类,上述三个步骤的代码都集中在这个类的 compile() 和 compile2() 中:

java 查看jvm方法(深入理解JVM之Javac编译器详解)(6)

java 查看jvm方法(深入理解JVM之Javac编译器详解)(7)

认真写文章,用心做分享。本文到这里就结束了,喜欢的朋友可以帮忙转发和关注一下,感谢支持!


作者:程序员java耕耘者
链接:https://juejin.im/post/5e15d6f36fb9a04818311bec

猜您喜欢: