JVM_04字节码文件结构
2022-09-06 10:32:45 0 举报
AI智能生成
JVM_04字节码文件结构
作者其他创作
大纲/内容
类信息
类的访问修饰符(U2)
记录类是什么类型的类,可以多种组合
当前类的名称(U2)
常量索引位置,在常量池查找
父类的名称(U2)
常量索引位置,在常量池查找
当前类实现接口的个数(U2)
一个类最多只能实现2^16个接口 65535
接口名字(U2 * 接口个数)
如果没有实现接口,则字节码中没有这段值
字段个数(U2)
类中变量的个数,不包括方法中的局部变量
字段表
就是字段的结构体,占用内存为字段个数*每个字段结构体
访问权限修饰符(U2)
字段的修饰符,可以组合
字段名索引(U2)
常量索引位置,在常量池查找
字段描述索引(U2)
属性表个数(U2)
字段中volatile、transient等属性
类的中的方法信息
方法个数(U2)
方法表(方法个数*方法结构体)
访问权限修饰符(U2)
方法名称索引(U2)
方法的属性个数(U2)
方法属性表
类的构造方法
类变量
成员变量
魔数(U4)
就是class文件已开始的 0xCAFEBABE,就是一个logo,表示这是java字节码文件
次版本号(U2)
主版本号(U2)
0x34十进制为52,是jdk1.8版本,51是1.7版本
常量
标志位(U1)
用一个字节表示,通过标志位从“class常量池类型分类”找到对应的常量的类型,并确定常量使用的空间,在依次往后找下一个常量
常量个数(U2)
javap -v 后,发现常量个数会比字节码中的所显示的数少一个,其实少的那一个事jvm定义的null,在第0号位置,从这开始就是常量池的入口。
常量池存放的常量
字面量
当常量为字面量的时候,会按照基本类型分配对应的字节数和记录对应的值,
Integer(U4),
Float(U4),
Long(U4(hight)+U4(low)),
Double(U4(hight)+U4(low))
字符串UTF-8比较特殊,是长度length(U2) + 对应的字节数组(U1 * length)
描述信息
基本参数类型
S(short),
I(Int),
F(float),
D(double),
B(byte),
J(long),
Z(boolean),
C(char)
空返回值
V(void)
对象类型
String getSome(int i , String str)的方法描述符号为(I,Ljava/lang/String;) Ljava/lang/String;
方法返回值在()之后
数组
用[表示,n维数组就用n个[,例如 String[][] 为 [[Ljava/lang/String;
方法类型
String getSome(int i , String str)的方法描述符号为(I,Ljava/lang/String;) Ljava/lang/String;
Code
存放字节码的地址
LineNumberTable
行表号,用来维护代码的源码行号,记录源码行号和字节码号一一对应的关系
LocalVariableTable
本地变量表,默认有一个this,这是构造方法中隐式在第一个参数传入this,从locals这个局部变量表中个数可以看出,局部变量表,操作数栈的空间在编译器就能确认
0 条评论
下一页