1.平台无关性和语言无关性
3.Class类文件结构
3.1文件准备
先准备简单的代码,生成class文件,使用16进制编辑器查看(我使用的winhex查看)
package com.ruoyi.weixin.user;
public class Hello {
private static final int a = 10;
private static int b;
private int c;
public int inc(){
return c - 1;
}
}
3.2magic魔数
3.2版本号
3.3常量池
3.3.1常量池容器计数器
查看偏移地址0x00000008-0x00000009,得到该常量池中一共有25(=26-1)个常量。减1的原因是常量是从1开始计数的。在Class文件格式规范制定之时,设计者将第0项常量空出来是有特殊考虑的,这样做的目的在于,如果后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义,可以把索引值设置为0来表示。Class文件结构中只有常量池的容量计数是从1开始。
3.3.2常量池常量
3.3.3常量表
3.3.4常量解析
下面就前面两个常量做一个解析
第一个常量0A 00 04 00 16(从0A判断常量类型,就可以知道这个常量的字节数)
OA是10,也就是说第一个常量的标志是10,查看结果总表,发现它是CONSTANT_Methodref_info,它包含三部分,共占5个字节
tag:OA,是10
index:00 04,是4,指向常量池中的第4个常量
index:00 16是第二个index,是22,指向常量池中第22个常量
第二个常量09 00 03 00 17
09是9,也就是标志是9,查看结果总表,发现它是CONSTANT_Fieldref_info,它包含三部分,共占5个字节
tag:09,是9
index:00 03,是3,指向常量池中的第4个常量
index:00 17是第二个index,是23,指向常量池中第23个常量
3.3.5使用javap来解析class文件
输入命令,输出字节码内容
javap -verbose Hello.class
可以看到共有25个常量,和常量计数器的数量一致,第一个是methodref,两个index指向第4和22个常量,第二个是fieldref,两个index指向第3和23个常量,和上面解析的是一样的
3.4访问标志
这里标志位是00 21,也就是0x0001和0x0020的和,表示被public修饰,且允许invokespecial字节码指令的新语义
3.5类索引、父类索引、接口索引集合
如上图所示:
类索引是00 03,指向常量池中第三个常量
父类索引是00 04,指向第四个常量
接口索引集合 00 00 ,没有实现接口
3.6字段表集合
后面紧跟着的就是字段学习。首先就是字段数量描述(字段表集合的大小),然后是字段表集合。
3.6.1简介
3.6.3字段表中的access_flags
3.6.4name_index
3.6.5descriptor_index
3.6.6attribute_count
字段数量:00 03 表示有三个字段,之后正式进入字段表集合
access_flags:00 1A表示 0x0002和0x0008和0x0010的和 表示private static final
name_index:00 05 指向第五个常量,字段名为a
descriptor_index:00 06指向第6个常量,值为 I,对于的 基本类型为int
再后面的属性表集合先不看,后面再讲
3.7方法表集合
3.7.1access_flags标志位
3.7.2 解析
access_flag:00 01 表示public
name_index:00 12 指向第18个常量,描述方法名
describle_index:00 13 指向第19个常量,描述方法学习,无参数,返回值int
属性表个数:00 01 1个属性表
属性表:后面讲