加强的for循环有两种,遍历数组和实现了Iterable接口的容器。javac通过visitForeachLoop()方法来实现解语法糖,代码如下:

 /** Translate away the foreach loop.  */
    public void visitForeachLoop(JCEnhancedForLoop tree) {
        if (types.elemtype(tree.expr.type) == null)
            visitIterableForeachLoop(tree);
        else
            visitArrayForeachLoop(tree);
    }

首先来看遍历数组。

A statement of the form
for ( T v : arrayexpr )
          stmt;
(where arrayexpr is of an array type) gets translated to
for ( { arraytype #arr = arrayexpr;
             int #len = array.length;
             int #i = 0; };
           #i < #len; i$++ ) {
         T v = arr$[#i];
         stmt;
     }
where #arr, #len, and #i are freshly named synthetic local variables.

举个例子,如下:

Integer[] array = { 1, 2, 3, 4, 5 };
for (Integer i : array) {
	System.out.println(i);
}

解语法糖后的结果如下:

for (Integer[] arr$ = array, len$ = arr$.length, i$ = 0; i$ < len$; ++i$) {
    Integer i = arr$[i$];
    {
        System.out.println(i);
    }
}

来看看对容器的遍历,如下:

 A statement of the form
for ( T v : coll )
          stmt ;
 (where coll implements Iterable<? extends T>) gets translated to
     for ( Iterator<? extends T> #i = coll.iterator(); #i.hasNext(); ) {
         T v = (T) #i.next();
         stmt;
     }
 where #i is a freshly named synthetic local variable.
List<String> list = new ArrayList<String>();
for(String str:list){
	System.out.println(str);
}  

解语法糖后的结果如下:

for (java.util.Iterator i$ = list.iterator(); i$.hasNext(); ) {
    String str = (String)i$.next();
    {
        System.out.println(str);
    }
}

  

  

  

  

Javac语法糖之增强for循环的更多相关文章

  1. Javac语法糖之内部类

    在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ...

  2. Javac语法糖之EnumSwitch

    在Switch中可以使用的类型有枚举.字符串类型与整形int类型,下面来具体看这几个类型. 1.switch为枚举类型 枚举类: enum Fruit { APPLE,ORINGE } 调用javac ...

  3. Javac语法糖之其它

    1.变长参数 class VarialbeArgumentsDemo { public static void doWork(int... a) {//可变参数 } public static voi ...

  4. Javac语法糖之TryCatchFinally

    https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3 Optionally replace a try s ...

  5. Javac语法糖之Enum类

    枚举类在Javac中是被当作类来看待的. An enum type is implicitly final unless it contains at least one enum constant ...

  6. Java语法糖设计

    语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...

  7. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  8. “全栈2019”Java第三十二章:增强for循环Foreach语法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. java语法糖:(1)可变长度参数以及foreach循环原理

    语法糖 语法糖:是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用 ...

随机推荐

  1. web service 项目 和 普通 web项目 的 区别

    web service 面向的是开发者(需要再次开发) 普通web 面向的是用户(直接使用)

  2. 使用Volley上传文件

    使用浏览器上传文件,然后通过Wireshark抓包分析,发现发送的数据大概是这个样子. MIME Multipart Media Encapsulation, Type: multipart/form ...

  3. 20155320 2016-2017-2 《Java程序设计》第六周学习总结

    20155320 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 输入输出 InputStream的read()方法每次都会尝试读入byte数组长度的数据,并 ...

  4. notepad++换行替换

  5. java Object解析

    java Object是所有对象的根父类,所有对象都直接或间接集成自该类. java 的Object类也比较简单,有equals(Object).toString().finalize() java方 ...

  6. JSP、Servlet中get请求和post请求的区别总结

    在学习JavaWeb最初的开始阶段,大家都会遇到HttpServlet中的doGet和doPost方法.前两天看<Head First Servlets & JSP>看到其中讲关于 ...

  7. Java中HTTP通信

    Java自带的get.post请求: get请求方式: package com.java; import java.io.BufferedReader; import java.io.IOExcept ...

  8. Sharepoint 安装部署Project Server

    #在SharePoint Central Administration-> Manage service applications中,点击New button,选择Project Service ...

  9. flume 整合kafka

    背景:系统的数据量越来越大,日志不能再简单的文件的保存,如此日志将会越来越大,也不方便查找与分析,综合考虑下使用了flume来收集日志,收集日志后向kafka传递消息,下面给出具体的配置 # The ...

  10. js url 参数 转换成 json 对象数据

    some=params&over=here => {"some":"params","over":"here&quo ...