jvm四:常量的本质含义以及助记符基本认识

package com.atChina.jvm;
/*
*  常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中,
*  本质上,调用类并没有直接引用到定义常量的类,因此并不会触发
*  定义常量的类的初始化, 因此也就不会执行静态代码块的代码
*
*  如下代码: 常量f="刘备",存放到了Test2的常量池中,之后Test2与Father2就没有任何关系了
*  甚至,我们可以删除Father2的class文件
*
*  bipush表示将单字节(-128至127)的常量值推送至栈顶
*  sipush表示将一个短整形常量值(-32768至32767)推送至栈顶
*  iconst_1 表示将int类型1推送至栈顶( iconst_0至iconst_5分表表示整形0至5)
*/
public class Test2 {
    public static void main(String[] args) {
        System.out.println(Father2.f);
        System.out.println(Father2.s);
        System.out.println(Father2.i);
        System.out.println(Father2.ii);
        System.out.println(Father2.iii);
    }
}

class Father2{
    public static final String f = "刘备";// 被final修饰了,所以f是一个常量
    public static final short s = 127;
    public static final int i = 32767;
    public static final int ii = 1;
    public static final int iii = 5;
    static{
        System.out.println("桃园结义");
    }
}

通过javap -c 类路径.类名 就可以反编译class文件

   ldc助记符:

          表示将int,float或是String类型的常量值从常量池中推送至栈顶

   bipush助记符:

      表示将单字节(-128至127)的常量值推送至栈顶

   sipush助记符:

             表示将一个短整形常量值(-32768至32767)推送至栈顶

    iconst_1助记符:

              iconst_1 表示将int类型1推送至栈顶( iconst_0至iconst_5分表表示整形0至5)

javap -c com.atChina.jvm.Test2
Compiled from "Test2.java"
public class com.atChina.jvm.Test2 extends java.lang.Object{
public com.atChina.jvm.Test2();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #4; //String 刘备
   5:   invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  bipush  127
   13:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   16:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  sipush  32767
   22:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   25:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   28:  iconst_1
   29:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   32:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   35:  iconst_5
   36:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   39:  return

}

 

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/89041205