字节码文件
-
字节码文件是一种二进制文件,扩展名为.class
-
通过 javac 将源码编译得到,是一种中间形式的代码,这种中间形式的代码让Java有了“一次编译,多次运行”的跨平台特点。
字节码文件的组成
由5大组成部分:基础信息、常量池、字段、方法、属性
-
基础信息
-
魔数、字节码文件对应的Java版本号访问标识(public、final等)父类和接口
-
-
常量池
-
保存了字符串常量、类或接口名、字段名主要在字节码指令中使用
-
-
字段
-
当前类或接口声明的字段信息
-
-
方法
-
当前类或接口声明的方法信息字节码指令
-
-
属性
-
类的属性,比如源码的文件名内部类的列表等
-
基础信息
-
文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件内容
-
软件使用文件的头几个字节(文件头)来校验文件的类型,如果软件不支持这种类型就会出错
魔数
Java字节码文件中,将文件头称为magic魔数
主副版本号
-
主副版本号指的是编译字节码文件的JDK版本号。
-
主要作用:判断当前字节码文件的版本和运行时的JDK版本是否兼容
常量池
作用:避免相同内存重复定义,节省空间。
-
常量池中每个数据都有一个编号,从1开始,在字段/字节码中可以通过编号快速查到该数据
-
符号引用过程:字节码指令中通过编号引用到常量池
方法
当前类或接口正在执行的方法。
里面的部分有:
-
操作数栈:用来存放临时数据的地方(也有可能在里面进行计算)
-
局部变量表:存放方法中局部变量的地方
举例:
int i =0;
int j = i+1;
上述代码执行过程:
-
iconst_0:将0存放到操作数栈中
-
istore_1:将操作数栈中的0 移到局部变量表中1的位置
-
iload_1:加载局部变量表中1下标处的数据到操作数栈中
-
iconst_1:将1添加到操作数栈中
-
iadd:将操作数栈中的0 和 1进行相加,并达到1
-
istore_2:将操作数栈中的元素移到局部变量表中2的位置
-
return:方法返回
下面是一个代码,请尝试自己来理解一下吧:
int i = 0;
i = i++;