import java.util.*;
public class ForEachDemo{
public static void main(String[] args){
List<String> data = new ArrayList<>();
data.add("a");
data.add("b");
for(String str : data){
System.out.println(str);
}
}
}
使用javac编译
javac ForEachDemo.java
编译后生成class文件: "ForEachDemo.class"
(生成的class文件实际就是Java bytecode)
使用javap反汇编class文件
javap -c ForEachDemo
反汇编结果:
C:UsersdreamDesktopMarkdownn学习Java基础JVM>javap -c ForEachDemo
Compiled from "ForEachDemo.java"
public class ForEachDemo {
public ForEachDemo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: ldc #4 // String a
11: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
16: pop
17: aload_1
18: ldc #6 // String b
20: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
25: pop
26: aload_1
27: invokeinterface #7, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
32: astore_2
33: aload_2
34: invokeinterface #8, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
39: ifeq 62
42: aload_2
43: invokeinterface #9, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
48: checkcast #10 // class java/lang/String
51: astore_3
52: getstatic #11 // Field java/lang/System.out:Ljava/io/PrintStream;
55: aload_3
56: invokevirtual #12 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
59: goto 33
62: return
}
结果分析
C:UsersdreamDesktopMarkdownn学习Java基础JVM>javap -c ForEachDemo
Compiled from "ForEachDemo.java"
public class ForEachDemo {
public ForEachDemo();
Code:
0: aload_0 #从本地变量0中加载一个对象引用到堆内存(这里的对象引用就是java.lang.Object)
1: invokespecial #1 // Method java/lang/Object."<init>":()V
#invokespecial 表示调用引用对象的一个实例方法(这里的方法就是java.lang.Object的init方法)
4: return #从方法返回空
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/util/ArrayList
#new 表示创建一个指定类的新实体(这里就是java.util.ArrayList类的新实体)
3: dup #把值复制到堆内存顶部
4: invokespecial #3 // Method java/util/ArrayList."<init>":()V
7: astore_1 #将一个引用保存到本地变量1
8: aload_1 #从本地变量1中加载一个对象引用到堆内存
9: ldc #4 // String a
#ldc 表示从常量池中把一个常量的索引放到堆内存(这里的常量就是String a)
11: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
16: pop #返回堆内存顶部的值(该值就是String a)
17: aload_1
18: ldc #6 // String b
20: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
25: pop
26: aload_1
27: invokeinterface #7, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
32: astore_2
33: aload_2
34: invokeinterface #8, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
39: ifeq 62 #如果值是0,跳转到62处的指令
42: aload_2
43: invokeinterface #9, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
48: checkcast #10 // class java/lang/String
51: astore_3
52: getstatic #11 // Field java/lang/System.out:Ljava/io/PrintStream;
55: aload_3
56: invokevirtual #12 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
59: goto 33
62: return
}
(”aload_0“,invokespecial”,..etc)就是Java bytecode指令
在维基百科上可以查看所有的Java bytecode指令列表,该列表包含了所有指令:
Java bytecode instruction listings