我的扩展功能描述如下: 在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导. 举两个例子: 例一: 如下JAVA代码(注意这里的var是新语法): import java.util.*; public class TestHello { private var i = new ArrayList<List<?>>(); } 在用我修改的编译器编译之后,再用反编译工具反编译之后会看到如下形式的代码: import java.util.ArrayList;…
1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化,由于java语言所有的类型都继承自Object,因此Object转型成任何对象都是有可能的,但是也因为有无限的可能性,就只有程序员和运行期的虚拟机才知道这个Object到底是个什么类型的对象.在编译期间,编译器无法检查这个Obj…
自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing). 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装(wrapper)类型. 之所以需要包装类型,是因为许多 Java 核心类库的 API 都是面向对象的.举个例子,Java 核心类库中的容器类,就只支持引用类型. 当需要一个能够存储数值的容器类时,我们往往定义一个存储包装类对象的容器. 对于基本类型的数值来说,我们需要先将其转换为对应的包装类,再存…
1.Javac概述 编译器可以将编程语言的代码转换为其他形式,如Javac,将Java语言转换为虚拟机能够识别的.class文件形式.而这种将java源代码(以.java做为文件存储格式)转换为class文件格式的过程一般也称为编译器的前端.要将字节码变为机器码还需要后端编译器,如JIT编译器(Just In Time Compiler).或者还可以通过AOT编译器直接将Java源代码编译为本地机器代码.本书涉及的主要内容就是Sun的Javac编译器. javac1.7中没有使用像Lex.YAC…
在每个人学习java的第一步,都是安装jdk ,jre,配置java_home,classpath,path. 为什么要做这些?在阅读java-core的时候,看到了原理,p141. 一 关于类的共享 为了使类能被多个程序共享,需要做到以下几步: 1.把类放到同一个目录中,且该目录是package树状结构的root目录:如将com.horstmann.corejava.Employee类添加在目录home/user/classdir下,这个Employee.class类文件就必须位于子目录/ho…
java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用静态提前编译器(AOT)直接把.java文件直接编译成本地机器代码的过程.现在讨论的是第一种编译器. Javac编译器 ①javac的源码与测试   运行com.sun.tools.javac.Main的main()方法来执行编译,与命令行中使用javac的命令没什么区别. 编译过程可以分为3个过程…
Javac编译器是把 *.java 文件转换为 *.class 文件,是一个前端编译器:对应着有一种把字节码转变为机器码的编译器,称为JIT编译器(Just In Time Compiler),比如 HotSpot VM 的C1.C2编译器:把 *.java 文件编译成机器码的编译器称为静态提前编译器: Javac编译器编译的过程可以为3个过程: 1.解析与填充符号表: 这个过程又可以细分为词法分析.语法分析和填充符号表: 词法分析:词法分析是将源代码的字符流转变为标记(Token)集合,单个字…
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分析.语法分析.生成抽象语法树.语义分析等,这部分操作是在Java虚拟机之外进行的,而解释器在虚拟机内部,所以Java程序的编译就是半独立的实现过程. 一.了解一下javac编译的详解过程 编译过程大致上分为三步:解析与填充符号表过程.插入式注解处理器的注解处理过程.分析与字节码生成过程.…
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分析.语法分析.生成抽象语法树.语义分析等,这部分操作是在Java虚拟机之外进行的,而解释器在虚拟机内部,所以Java程序的编译就是半独立的实现过程. 一.了解一下javac编译的详解过程 编译过程大致上分为三步:解析与填充符号表过程.插入式注解处理器的注解处理过程.分析与字节码生成过程. (1)词法.语法分析…
编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树. 填充符号表,产生符号地址和符号信息. 插入式注解处理器的注解处理过程.可以把插入式注解处理器看作是一组编译器的插件,当这些插件工作时,允许读取.修改.添加抽象语法树中的任意元素.如Lombok注解. 分析与字节码生成过程,包括: 标注检查.对语法的静态信息进行检查. 数据流及控制流分析.对程序…