编译器优化
1. 概述
编译期包括:
- 前端编译器把.java转变为.class
- 虚拟机的后端运行期编译器(JIT编译器)把字节码转变为机器码
- 使用静态提前编译器(AOT编译器)直接把.java编译成本地机器码
本章讲述针对上面第一类编译过程的优化。
前端编译器做了很多针对Java语言编码过程的优化措施改善程序编码风格、提高编码效率。
2. javac编译器
javac编译过程:
- 解析与填充符号表
- 插入式注解处理器的注解处理过程
- 分析与字节码生成
3. Java语法糖
-
泛型与类型擦除
Map<String,String> map = new HashMap<>(); map.put("a","啊"); System.out.println(map.get("a")); 泛型擦除后(下面代码是反编译上面代码的字节码) Map map = new HashMap(); map.put("a","啊"); System.out.println((String)map.get("a"));
泛型擦除仅仅是对方法的Code属性中的字节码擦除,实际上元数据中还是保留了泛型信息(Signature属性),这是能通过反射手段取得参数化类型的根本依据。
-
自动装箱、拆箱、遍历循环
自动装箱、拆箱在编译后被转换为了对应的包装和还原方法,遍历代码则把代码转化为了迭代器的实现。
List<Integer> list = Arrays.asList(1); int sum = 0; for(int i : list){ sum += i; } 反编译上面代码的字节码 List<Integer> list = Arrays.asList(new Integer[](Integer.valueOf(1)); int sum = 0; // 此处是被遍历循环的类要实现Interator接口的原因 for(Interator localInterator = list.interator();localInterator.hasNext();){ int i = ((Integer)localInterator.next()).intValue(); sum += i; }
-
条件编译
if(true){ System.out.println("block 1"); }else{ Syetem.out.println("block 2"); }
-
其他语法糖
有内部类、枚举类、断言语句、对枚举和字符串的switch支持、try语句中定义和关闭资源。
网友评论