java的编译过程分析

环境准备

准备Hello.java文件

1
2
3
4
5
6
7
public class Hello {
public int a = 2+3;
public int fun() {
int b=a +10;
return b;
}
}

准备执行编译的代码

1
2
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null,null, null, "-verbose","./src/main/java/Hello.java");

tools.jar加入到classpath中,(tools.jar在jdk的lib目录下)

为了查看源带

javac编译器是官方JDK中提供的前端编译器,JDK/bin目录下的javac只是一个与平台相关的调用入口,具体实现在JDK/lib目录下的tools.jar。
此外,JDK6开始提供在运行时进行前端编译,默认也是调用到javac。

javac是由Java语言编写的,而HotSpot虚拟机则是由C++语言编写;
标准JDK中并没有提供javac的源码,而在OpenJDK中的提供;
我们需要在Eclipse中调试跟踪javac源码,看整个编译过程是如何实现的。
需要在openjdk上下载,地址http://hg.openjdk.java.net/jdk8/jdk8/langtools/

下载好之后,在eclipse中设置下原代码的查找路径。
若是idea,则要多加一步,在setting>Build,Exection>Debugger>Stepping>Do not step into the class 中取消对sum包的构选。

几个关键点

词法分析

  • com.sun.tools.javac.parser.Lexer 接口
  • ScannerJavaTokenizer实现类
  • 核心函数token()

java的编译过程分析
https://blog.fengcl.com/2021/02/28/javac-debug/
作者
frank
发布于
2021年2月28日
许可协议