出栈/装入局部变量表指令
类型 常数指令 范围 int(boolean,byte,char,short) iconst [-1,5] bipush [-128,127] sipush [-32768,32767] ldc any int value long lconst 0,1 ldc any long value float fconst 0,1,2 ldc any double value double dconst 0,1 ldc any double value reference aconst null ldc String literal,Class literal
算术指令
类型转换指令
① 宽化类型转换
注意 : 在字节码文件中, 没有byte, char, short, 这些统统用int表示, 因为局部变量表中, 每个槽位占用4个字节, 即使他们占用的内存空间小于4字节, 但是还会占用一个槽位
② 窄化类型转换(强制类型转换)
对象的创建与访问指令
① 对象创建指令
② 字段访问指令
③ 数组操作指令
④ 类型检查指令
方法调用指令
② 方法返回指令
操作数栈管理指令
控制转移指令
① 比较指令
② 条件跳转指令(不包含int类型, 只有 float double long)
③比较条件跳转指令(针对int类型)
④ 多条件分支跳转指令
⑤ 无条件跳转指令
异常处理指令
① 抛出异常指令
② 异常处理与异常表
如果从0-22出现异常, 且被FileNotFoundException捕捉到,就会跳转到25位置 下一个同理
同步控制指令
① 方法级的同步
方法级别的同步不能再字节码文件上体现, 同没有加synchronized的方法字节码文件完全相同, 但是可以在方法描述部分体现
② 方法内部指定指令序列的同步
monitorenter : 获取同步锁, 并将其他想要获取锁的线程阻塞
monitorexit : 释放同步锁
从22-26可以看出, 这段字节码是对异常的处理, 查看一下异常表
从表中可以看出, 7-19是同步代码快中的字节码指令, 说明, 如果在同步代码块中出现任何异常, 那么字节码指令就会跳转到22行,22-26即是释放锁的字节码. 说明即使发生异常, 也会释放锁