java查看字节码

时间:2021-09-28 14:08:42

①先使用javac XXX.java 生成XXX.class文件

②在使用javap -c XXX即可查看二进制字节码查看程序运行的原理


举个栗子:

public class Test {
public static void main(String[] args) {
int count = 0;
count = count++;
System.out.println(count);//0
}
}

C:\Users\qiyu\eclipse-workspace\Test\src\test>javac Test.javaC:\Users\qiyu\eclipse-workspace\Test\src\test>javap -c Test警告: 二进制文件Test包含test.TestCompiled from "Test.java"public class test.Test {  public test.Test();    Code:       0: aload_0       1: invokespecial #1                  // Method java/lang/Object."<init>":()V       4: return  public static void main(java.lang.String[]);    Code:       0: iconst_0       1: istore_1       2: iload_1       3: iinc          1, 1       6: istore_1       7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;      10: iload_1      11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V      14: return}


部分字节码说明

Java虚拟机没有明确规定整型数据溢出的情况,但规定了处理整型数据时,只有除法和求余指令出现除数为0时会导致虚拟机抛出异常。

加载和存储指令

    加载和存储指令用于将数据从哦你哦过栈帧的局部变量表和操作数栈之间来回传输。

    1)将一个局部变量加载到操作数栈的指令包括:iload,iload_<n>,lload、lload_<n>、float、 fload_<n>、dload、dload_<n>,aload、aload_<n>。
    2)将一个数值从操作数栈存储到局部变量标的指令:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstore_<n>,astore,astore_<n>
    3)将常量加载到操作数栈的指令:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_<i>,lconst_<l>,fconst_<f>,dconst_<d>
    4)局部变量表的访问索引指令:wide
    一部分以尖括号结尾的指令代表了一组指令,如iload_<i>,代表了iload_0,iload_1等,这几组指令都是带有一个操作数的通用指令。

运算指令

    算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。
    1)加法指令:iadd,ladd,fadd,dadd
    2)减法指令:isub,lsub,fsub,dsub
    3)乘法指令:imul,lmul,fmul,dmul
    4)除法指令:idiv,ldiv,fdiv,ddiv
    5)求余指令:irem,lrem,frem,drem
    6)取反指令:ineg,leng,fneg,dneg
    7)位移指令:ishl,ishr,iushr,lshl,lshr,lushr
    8)按位或指令:ior,lor
    9)按位与指令:iand,land
    10)按位异或指令:ixor,lxor
    11)局部变量自增指令:iinc
    12)比较指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp