一,类结构
himagic:魔数
minor_version 小版本号
major_version 主版本号
constant_pool_count 常量池
access_flags 访问修饰符(public)
this_class 类的包名,类名
super_class 父类
interfaces_count 接口信息
fields 成员变量,静态变量等变量信息
method 方法信息
attributes_count 附加属性
用一段代码:
编译成.class字节码文件就是这样(16进制)
一)魔数
二)版本信息
类中没有小版本号
00 34 是十六进制, 对应的十进制是52,52版本号对应Java8
三)常量池
下图简称图1
注意: 以下为16进制表示,每位代表一个二进制的4位(1111 = 16),所以两位就代表一个字节
常量池中存储34项内容
常量池的第一项0a的十进制是10,我们去图1中可以看到这是Methodref, 各用两个字节存储常量池的方法所属类,和方法名
构造方法
局部变量表
代表字符串
这三个代表方法的方法名,参数,返回值等信息
args参数的类型
方法参数
下面两个合在一起表示类的源文件是HelloWorld.Java
本类全限定名
父类全限定名
四)访问标识与继承信息
五)Field信息
六)附加属性
二,字节码指令
.java源代码被编译成二进制.class字节码文件, 那么源代码中的方法在.class文件中是怎么执行的呢?
下面有两个方法的二进制执行流程
init()方法
下图是一个Hello World类的构造方法,位于0000720行
jvm首先会在局部变量表中找到this, 放入操作数栈中
b7. 相当于 . 调用方法
00 01 调用父类的构造方法
官方文档里2a对应aload_0, b1对应return
main()方法
00 02 代表System类中的静态变量out, out的类型为PrintStream