javap

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 }
原文地址:https://www.cnblogs.com/happy-coder/p/6139844.html