字节码指令
1.重要的相关参数
1.1常量池信息
1.2访问标识和继承信息
1.3Field信息
2.字节码指令
2.1 入门
public cn.itcast.jvm.t5.HelloWorld(); 构造方法的字节码指令1. 2a => aload_0 加载 slot 0 的局部变量,即 this,做为下面的 invokespecial 构造方法调用的参数
\2. b7 => invokespecial 预备调用构造方法,哪个方法呢?
\3. 00 01 引用常量池中 #1 项,即【 Method java/lang/Object.""😦)V 】
\4. b1 表示返回
另一个是 public static void main(java.lang.String[]); 主方法的字节码指令
\1. b2 => getstatic 用来加载静态变量,哪个静态变量呢?
\2. 00 02 引用常量池中 #2 项,即【Field java/lang/System.out:Ljava/io/PrintStream;】
\3. 12 => ldc 加载参数,哪个参数呢?
\4. 03 引用常量池中 #3 项,即 【String hello world】
\5. b6 => invokevirtual 预备调用成员方法,哪个方法呢?
\6. 00 04 引用常量池中 #4 项,即【Method java/io/PrintStream.println:(Ljava/lang/String;)V】
\7. b1 表示返回
请参考
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5
2.2 javap工具
自己分析类文件结构太麻烦了,Oracle 提供了 javap 工具来反编译 class 文件
2.3 图解方法执行流程
1)原始java 代码
package cn.itcast.jvm.t3.bytecode; /*** 演示 字节码指令 和 操作数栈、常量池的关系 */ public class Demo3_1 {
public static void main(String[] args) {
int a = 10;
int b = Short.MAX_VALUE + 1;
int c = a + b;
System.out.println(c);
}
}
2)反编译后的字节码文件
[root@localhost ~]# javap -v Demo3_1.class
Classfile /root/Demo3_1.class
Last modified Jul 7, 2019; size 665 bytes
MD5 checksum a2c29a22421e218d4924d31e6990cfc5
Compiled from "Demo3_1.java"
public class cn.itcast.jvm.t3.bytecode.Demo3_1
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
\#1 = Methodref #7.#26 // java/lang/Object."<init>":()V
\#2 = Class #27 // java/lang/Short
\#3 = Integer 32768
\#4 = Fieldref #28.#29 //
java/lang/System.out:Ljava/io/PrintSt