Bill-Mac:learning Bill$ javap -verbose Test
Compiled from "Test.java"
public class Test extends java.lang.Object
SourceFile: "Test.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#15; // java/lang/Object."<init>":()V
const #2 = String #16; // ab1
const #3 = Field #17.#18; // java/lang/System.out:Ljava/io/PrintStream;
const #4 = Method #19.#20; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class #21; // Test
const #6 = class #22; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V;
const #13 = Asciz SourceFile;
const #14 = Asciz Test.java;
const #15 = NameAndType #7:#8;// "<init>":()V
const #16 = Asciz ab1;
const #17 = class #23; // java/lang/System
const #18 = NameAndType #24:#25;// out:Ljava/io/PrintStream;
const #19 = class #26; // java/io/PrintStream
const #20 = NameAndType #27:#28;// println:(Ljava/lang/String;)V
const #21 = Asciz Test;
const #22 = Asciz java/lang/Object;
const #23 = Asciz java/lang/System;
const #24 = Asciz out;
const #25 = Asciz Ljava/io/PrintStream;;
const #26 = Asciz java/io/PrintStream;
const #27 = Asciz println;
const #28 = Asciz (Ljava/lang/String;)V;
{
public Test();
Code:
Stack=1, Locals=1, Args_size=1 //全部方法都會有,stack表明棧頂的單位大小(每一個大小爲1個slot,每一個slot是4個字節寬度)
0: aload_0 //第一個0表明虛指令中的行號,每一個方法從0開始遞增,可是能夠跳躍。
1: invokespecial #1; //Method java/lang/Object."<init>":()V //構造方法、父類構造方法以及非靜態的private方法調用指令
4: return
LineNumberTable:
line 2: 0
注:當須要使用一個數據時,它首先會被放入棧頂,使用完後會寫回到本地變量或主存中。這裏棧的寬度是1,其實表明有一個this將會被引用。
Locals是本地變量的slo個數,可是並不表明與Stack寬度一致。(double、long會佔用兩個slot)
Args_size表明的是入口參數的個數,再也不試slot的個數。
aload_0指令是講「第一個」slot所在的本地變量推到棧頂,而且這個本地變量是引用類型的。
public static void main(java.lang.String[]);
Code:
Stack=3, Locals=3, Args_size=1
0: ldc #2; //String ab1
2: astore_1
3: ldc #2; //String ab1
5: astore_2
6: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_2
10: dup
11: astore_1
12: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: return
LineNumberTable:
line 4: 0
line 5: 3
line 6: 6
line 7: 15
}