Java虚拟机(十二)--字节码解析附录

JVM常量池元素

11种常量
编号常量池元素名称tag位标识含义
1CONSTANT_Utf8_info1utf-8编码的字符串
2CONSTANT_Integer_info3整型字面量
3CONSTANT_Float_info4浮点型字面量
4CONSTANT_Long_info5长整型字面量
5CONSTANT_Double_info6双精度字面量
6CONSTANT_Class_info7类或接口的符号引用
7CONSTANT_String_info8字符串类型字面量
8CONSTANT_Fieldref_info9字段的符号引用
9CONSTANT_Methodref_info10类中方法的符号引用
10CONSTANT_InterfaceMethodref_info11接口中方法的符号引用
11CONSTANT_NameAndType_info12字段和方法的名称以及类型的符号引用

常量池元素的复合结构
类型/含义结构类型描述
CONSTANT_Utf8_info
UTF-8编码的字符串
tagu1值为1
lengthu2utf-8缩略编码字符串所占字节数
bytesu1长度为length的utf-8编码字符串
CONSTANT_Integer_info
整型字面量
tagu1值为3
bytesu4按照高位在前存储的int值
CONSTANT_Float_info
浮点型字面量
tagu1值为4
bytesu4按照高位在前存储的float值
CONSTANT_Long_info
长整型字面量
tagu1值为5
bytesu8按照高位在前存储的long值
CONSTANT_Double_info
双精度浮点型字面量
tagu1值为6
bytesu8按照高位在前存储的double值
CONSTANT_Class_info
类或接口的符号引用
tagu1值为7
indexu2指向全限定名常量项的索引
CONSTANT_String_info
字符串类型字面量
tagu1值为8
indexu2指向字符串字面量的索引
CONSTANT_Fieldref_info
字段的符号引用
tagu1值为9
indexu2指向CONSTANT_Class_info的索引
indexu2指向Constant_NameAndType_info的索引
CONSTANT_Methodref_info
类中方法的符号引用
tagu1值为10
indexu2指向CONSTANT_Class_info的索引
indexu2指向Constant_NameAndType_info的索引
CONSTANT_InterfaceMethodref_info
接口中方法的符号引用
tagu1值为11
indexu2指向CONSTANT_Class_info的索引
indexu2指向Constant_NameAndType_info的索引
CONSTANT_NameAndType_info
字段和方法的名称以及类型的符号引用
tagu1值为12
indexu2指向字段或方法名称常量项的索引
indexu2指向字段或方法描述符常量项的索引

访问标识与继承信息

字节码文件中,紧跟着常量池信息之后的就是访问标志,access_flags结构,该结构类型是u2,占用2个字节空间。
access_flags标识代表访问标志位,该标志用于标注类或接口层次的访问信息,如当前class是类还是接口,是否是public等。

	access_flags可选项
标志名称标识值含义
ACC_PUBLIC0x0001是否是public
ACC_FINAL0x0010是否是final,只有类可以设置为这个值
ACC_SUPER0x0020是否允许使用invokespecial,jdk 1.2后这个值为真
ACC_INTERFACE0x0200标识这是一个接口
ACC_ABSTRACT0x0400是否是抽象类型,对于接口和抽象类为真,其他类为假
ACC_SYNTHETIC0x1000标识这个类不是由用户代码产生
ACC_ANNOTATION0x2000标识这是一个注解
ACC_ENUM0x4000标识这是一个枚举

public final class类的访问标志值是 0x0031,也就是ACC_PUBLIC,FINAL,SUPER的异或值。
public class类的访问标志值是 0x0021


fields结构组成

类型名称数量
u2access_flags1
u2name_index1
u2descriptor_index1
u2attributes_count1
attribute_infoattributesattributes_count

access_flags的可选项

标识名称标志值含义
ACC_PUBLIC0x0001字段是否是public
ACC_PRIVATE0x0002字段是否是private
ACC_PROTECTED0x0004字段是否是protected
ACC_STATIC0x0008字段是否是static
ACC_FINAL0x0010字段是否是final
ACC_VOLATILE0x0040字段是否是volatile
ACC_TRANSIENT0x0080字段是否是transient
ACC_SYNTHETIC0x1000字段是否是编译器自动生成
ACC_ENUM0x4000字段是否是enum

字段描述符与基本数据类型对应表:

描述符含义
Bbyte
Cchar
Ddouble
Ffloat
Iint
Jlong
Sshort
Zboolean
V特殊类型void
L对象类型,比如Ljava/lang/Object

String[][],的描述符为[[Ljava/lang/String;


methods结构组成

类型名称数量
u2access_flags1
u2name_index1
u2descriptor_index1
u2attributes_count1
attribute_infoattributesattributes_count

access_flags的可选项

标识名称标志值含义
ACC_PUBLIC0x0001字段是否是public
ACC_PRIVATE0x0002字段是否是private
ACC_PROTECTED0x0004字段是否是protected
ACC_STATIC0x0008字段是否是static
ACC_FINAL0x0010字段是否是final
ACC_SYNCHRONIZED0x0020字段是否是synchronized
ACC_BRIDGE0x0040方法是否由编译器产生的桥接方法
ACC_VARARGS0x0080方法是否接收可变参数
ACC_NATIVE0x0100方法是否是native
ACC_ABSTRACT0x0400方法是否abstract
ACC_STRICTFP0x0800方法是否strictfp
ACC_SYNTHETIC0x1000方法是否是编译器自动生成

9大属性表集合

属性名称使用位置含义
Code方法表含有字节码指令
ConstantValue字段表final关键字定义的常量值
Deprecated类文件,字段表,方法表被声明为deprecated的方法和字段
Exceptions方法表方法抛出的异常
InnerClassed类文件内部类列表
LineNumberTableCode属性源码行号与字节码指令的对应关系
LocalVariableTableCode属性方法局部变量的描述
SourceFile类文件源文件名称
Synthetic类文件、字段表、方法表方法或字段是否是编译器自动生成

Code属性(除了接口方法和抽象方法以外,都有)

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2max_stack1
u2max_locals1
u4code_length1
u1codecode_length
u2exception_table_length1
exception_infoexception_tableexception_table_length
u2atribute_count1
attribute_infoattributesatribute_count

code_length长度为u4,所以如果一个方法超过了65535条字节码指令,javac将拒绝编译。

ConstantValue属性

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2constantvalue_index1

虚拟机规范要求,只有static修饰的字段才能有constantValue属性,但是编译器又加了个条件,必须同时被final和static修饰的字段才能有这个属性。
否则在< clinit>中初始化。

Exceptions属性
方法描述时throws关键字抛出的异常,与Code属性平级。

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2number_of_exceptions1
u2exception_index_tablenumber_of_exceptions

InnerClass属性

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2numbers_of_classes1
inner_classes_infoinner_classednumbers_of_classes

inner_classes_info表结构

类型名称数量
u2inner_classes_info_index1
u2outer_classes_info_index1
u2inner_name_index1
u2inner_name_access_flags1

lineNumberTable

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2line_number_table_length1
line_number_infoline_number_tableline_number_table_length

line_number_info

类型名称数量说明
u2start_pc1字节码行号
u2line1java源码行号

localvariabletable属性
用于描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的关系

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2local_variable_table_length1
local_variable_infolocal_variable_tablelocal_variable_table_length

local_variable_info的结构

类型名称数量说明
u2start_pc1局部变量的声明周期开始的字节码偏移量
u2length1局部变量作用范围覆盖的长度
u2name_index1变量名索引
u2description_index1局部变量描述符索引
u2index1局部变量在栈帧局部变量表中slot的位置

不生成该属性,则他人引用这个方法时,参数名称都将丢失,调试时调试器无法根据参数名称从运行上下文中获取参数值。

SourceFile属性

类型名称数量
u2attribute_name_index1
u4attribute_length1
u2sourcefile_index1

Deprecated和synthetic没有属性值,只存在有和没有的区别。

类型名称数量
u2attribute_name_index1
u4attribute_length1

attribute_length的值必须为0x0000 0000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值