java源码的编译机制
来源:互联网 发布:零基础学python的书籍 编辑:程序博客网 时间:2024/06/17 17:08
1.java源码编译机制
Sun JDK 中实现 java 源码编译器的是 javac, javac 将 java 源码编译为 class 文件的步骤如下图。
步骤介绍:
1 分析和输入到符号表(Parse and Enter)
Parse过程所做的为词法和语法分析。
词法分析(com.sun.tools.javac.parse.Scanner)要完成的使将代码字符串转变为token序列(例如 Token.EQ(name:=));
语法分析(com.sun.tools.javac.parser.Parser)要完成的使根据语法由token 序列生成抽象语法树。
Enter(com.sun.tools.javac.comp.Enter) 过程为将符号输入到符号表,通常包括确定类的超类型和接口,根据语法由 token 序列生成抽象语法树。
2. 注解处理(Annotation Processing)
该步骤主要用于处理用户自定义的 annotation, 可能带来的好处使基于 annotation 来生成附加的代码或进行一些特殊的检查,从而节省一些共用的代码编写,即生成class文件时,根据用户自定义注解,将对应代码生成至 .class 文件中。
3. 语义分析和生成 class 文件(Analyse and Generate)
Analyse 步骤基于抽象语法树进行一系列的语义分析,包括将语法树中的名字,表达式等元素与变量,方法,类型等联系到一起;检查变量使用前是否已声明;推导泛型方法的类型参数;检查类型匹配;进行常量折叠;检查所有语句都可到达;检查所有 checked exeception 都被捕获或抛出;检查变量的确定型赋值(如由返回值的方法必须确定有返回值);检查变量的确定性不重复赋值(如声明为 final 的变量等);解除语法糖(消除 if(false){...} 形式的无用代码;将泛型 Java 转为普通 Java;将含有语法糖的语法树改为含有简单语言结构的语法树,例如 foreach 循环,自动拆/装箱等)等。
完成语义分析后,开始生成 class 文件(com.sun.tools.javac.jvm.Gen)
生成步骤为:
1. 将示例成员初始化器收集到构造器中,将静态成员初始化器收集为<clinit()>; 接着将抽象语法树生成字节码,采用的方法为后序遍历语法树,并且最后进行少量的代码转换(如String相加转变为StringBuffer),最后从符号表中生成class文件。
(注:clinit()方法是在JVM第一次加载class文件时调用,编译器自动收集类所有类变量(即静态变量)的赋值动作和静态语句块(static)中语句产生的。详细信息 参考:http://blog.csdn.net/java528416037/article/details/48463639)
- java源码的编译机制
- JAVA源码编译机制
- Java源码编译机制、类加载机制、类执行机制
- java的编译机制
- jvm 之 java源码编译机制-感想
- 深入JVM【1】java源码编译机制
- JVM之java源码编译机制
- eclipse源码编译的apk开发,使用系统签名机制.
- java编译静态常量的机制
- java编译静态常量的机制
- java的一次编译多次执行机制
- Java的编译机制小总结
- java源代码编译机制
- Java的pacakge机制,java程序的编译运行过程
- Java源码编译过程
- Java源码编译过程
- Java源码编译过程
- ANT编译JAVA源码
- 单例模式
- 数据结构-堆栈和队列
- OpenGL ES 光照(一)
- 2017/11/16 LINUX学习笔记
- jq点击多次,有多个事件产生的解决方法
- java源码的编译机制
- C++对象模型(一)单继承
- easyui combox 后台获取json,前台显示,报406错误
- ERROR 1227 (42000): Access denied; you need (at least one of)...
- nginx详解之反向代理和负载均衡
- 高德地图
- Eclipse +python +PyDev 环境搭建
- 配置Maven,Tomcat,Svn的过程
- Multiple markers at this line