天天看點

Java基礎實踐一:for關鍵字的實作原理

Java源碼:

/**
 * Demo.java
 * com.yuanchuangyun.libra.web
 *
 *
 *   ver     date              author
 * ──────────────────────────────────
 *            2017年5月19日         renguoqiang
 *
 * Copyright (c) 2017, yuanchuangyun All Rights Reserved.
*/

package com.yuanchuangyun.libra.web;

public class Demo {
    public void test(){
        for(int i= 0;i<5;i++){
            System.out.println(i);
        }
    }
}      

Java反編譯指令:

javap -c Demo.class >Demo.txt      

Java反編譯結果:

Compiled from "Demo.java"
public class com.yuanchuangyun.libra.web.Demo {
  public com.yuanchuangyun.libra.web.Demo();
    Code:
       0: aload_0       
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return        

  public void test();
    Code:
       0: iconst_0      
       1: istore_1      
       2: goto          15
       5: getstatic     #15                 // Field java/lang/System.out:Ljava/io/PrintStream;
       8: iload_1       
       9: invokevirtual #21                 // Method java/io/PrintStream.println:(I)V
      12: iinc          1, 1
      15: iload_1       
      16: iconst_5      
      17: if_icmplt     5
      20: return        
}      

Java裡的for其實是用goto關鍵字實作的。

讓我想起了09年一次去微軟亞洲研究院面試,面試者問我C#裡的for循環底層使用什麼實作的,我确實不知道。

另外,11年在微軟亞洲研究院因為工作需要,反編譯Windows HPC Server的某個dll(C#編寫的),發現裡邊竟然用goto關鍵字寫代碼。