Java文件字节码内容总结2

本文详细介绍了Java类文件的结构,包括控制标志、类索引、父类索引、接口索引集合等内容,并解释了字段表集合、方法表集合及属性表集合的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.4 控制标志

  紧接着常量池之后的2个字节表示访问标志,2个字节共有16位,每位值可为0或者1,目前只是用了8位。这两个字节里包含了Class是类还是接口,是否为public,是否为抽象的等等。前面说常量池中没有关于访问控制的内容,控制部分在这里。

3.5 类索引、父类索引和接口索引集合

    类索引this_class、父类索引super_class和接口索引集合interfaces,每个占据2个字节,Class文件中用这三项来确定类的继承关系。前面常量池中是有class类型的常量,但是常量池中可能存在多个(每个类至少有个Object的父类),你并不知道哪个代表当前类,哪个是父类。这三项都是索引值,指向常量池中的常量。

  super_class只有两字节,因为java中不允许多重继承,所以只有一个父类索引(对于一个有多个层级继承关系的类结构来说,某个类的类文件中只显示它的直接父类)。

  java中接口可以继承多个,所以接口索引是集合;集合个数不确定,所以和前面一样,需要在前面放一个2字节的内容代表接口的数量N,然后后面跟着N个2字节,每个2字节对应一个常量池中的类和接口型的常量索引地址。

3.6 字段表集合

  既然以集合开头,那么肯定先制定集合的长度,也是由2字节的内容来表示长度;字段表用来描述接口或者类中声明的变量,说明:字段表包括实例级变量或者类变量,但是不包括方法内部声明的变量,也不包括父类或者父接口中声明的变量。

  字段表的结构:


描述符索引一些规则:如数组用[表示,二维数组就用[[,对象用L开始,后面跟对象的权限定名(就是类的全名把.换成/,结束加上;)类型基本都是首字母大写来表示,但是有几个特殊long用J表示,boolean用Z表示。

3.7 方法表集合

   和字段表集合结构一样。

   不同的几个地方:控制标志中volatile和transient关键字不能修饰方法,所以没有这两个标志位。增加了synchronized,native,strictfp,abstract关键字。

   方法代码放在名为Code的属性中了。

   同样,方法表集合中不会有父类的方法;可能有编译器自动添加的实例构造器"<init>"方法和类构造器"<cinit>"方法。

3.8 属性表集合

    Java虚拟机运行时会忽略掉它不认识的属性。

    需要注意的是Code属性,对应方法的执行内容。Code属性的结构包括attribute_length,

max_stack--操作数栈的最大深度;

max_locals--局部变量需要的存储空间,单位是slot,slot是虚拟机为局部变量分配内存的最小单位,如int一般是一个slot;说明:即使实例方法没有参数,局部变量长度也为1,因为存放指向当前实例对象引用;

code_length:字节码长度(指方法体内容编译后的字节码指令长度),4个字节,最大不超过65535条字节码指令。

code:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值