Java字节码结构剖析二:字段表

  • 时间:
  • 浏览:0
  • 来源:彩神欢乐生肖_神彩欢乐生肖官方

5

类索引,this_class 的值也能 是对 constant_pool 表中项目的一个有效索引值。constant_pool 表在你你这一索引处的项也能 为 CONSTANT_Class_info 类型常量,表示你你这一 Class 文件所定义的类或接口。

表示该字段是String类型。

u2 name_index;

#43 = Utf8 java/lang/Object

4

看在我字节码中的16进制表示,0×0000=0。0代表那末修饰符的意思。看朋友的源码:String str = “Welcome”;,即默认修饰符。

朋友的代码那末实现任何接口,统统该项值为0,即0×0000。

interfaces[]

}

6

7

#38 = Utf8 com/shengsiyuan/jvm/bytecode/MyTest2

接口计数器,interfaces_count 的值表示当前类或接口的直接父接口数量。

attributes 表的每一个成员的值也能 是 attribute行态,一个字段还也能 有任意个关联属性。

#5 = Class #38 // com/shengsiyuan/jvm/bytecode/MyTest2

attribute_info attributes[attributes_count];

朋友的字节码里该位置的16进制表示是0×0021。0×0021=0×0001 ^ 0×0020。即代表该类的访问修饰是public的。ACC_SUPER这里不做介绍,看看JVM规范对他的描述,了解即可。

1

access_flags

以上统统字段表里的第一个字段的完整篇 字节码信息描述。也统统朋友定义的『str』字段的信息。朋友代码里还一个字段 private int x = 5public static Integer in = 10。我便不再描述了,朋友还也能 紧接着我里边把你你这一个字段的信息解析出来。

在字节码里,0x0000=0。即该字段那末附加属性。

在JVM规范中,每个变量/字段都在描述信息,描述信息主要作用是描述字段的数据类型、土法律法子的参数列表(包括数量,类型与顺序)与返回值。根据描述符规则,基本数据类型和代表无返回值的void类型都用一个大写字符来表示,对象类型则使用字符L加对象的全限定名称来表示。为了压缩字节码文件的体积,对于基本数据类型,JVM都只使用一个大写字母表示,如下所示:B-byte、C-char、D-double、F-float、I-int、J-long、S-short、Z-boolean、V-void、L-对象类型,如Ljava/lang/String。

对于数组类型来说,每一个纬度使一个前置的[表示,如int[]被记录为[I,String[][]被记录为[[Ljava/lang/String;。

愿因该字段那末附加属性,统统这项数据那末。

field_info行态格式如下:

super_class_name

1

2

2

u2 attributes_count;

字段表用于描述类和接口中声明的变量。这里的字段中含了类级别变量以及实例变量,就说 不包括土法律法子组织组织结构声明的局部变量。

在字节码里是0x000B=11。常量池11处:

字节码中,0x000C=12。看常量池:

1

接口表,interfaces[]数组中的每个成员的值也能 是一个对 constant_pool 表中项目的一个有效索引值,它的长度为 interfaces_count。

1

this_class_name

在我的字节码文件中,该16进制值为0×0005=5。通过常量池信息,最终他指向的是一个utf-8字符串,com/shengsiyuan/jvm/bytecode/MyTest2。即类的全限定名。

field_info {

表示字段的名称为“str”。

interfaces_count

字段计数器,fields_count 的值表示当前 Class 文件 fields[]数组的成员个数。也统统当前类的类字段和实例字段的个数。

#10 = Class #43 // java/lang/Object

原文发布时间为:2018-11-22

在字节码文件中,父类索引为0x000A=10。即父类是 java/lang/Object

访问标志信息包括该class文件是类还是接口,与非 定义成public,与非 abstract,愿因是类,与非 被申明为final。access_flags 的取值范围和相应含义见下表。

access_flags 项的值是用于定义字段被访问权限和基础属性的掩码标志。access_flags 的取值范围和相应含义见如下表:

#12 = Utf8 Ljava/lang/String;

fields[]

fields_count



父类索引,对于类来说,super_class 的值也能 为 0 愿因是对 constant_pool 表中项目的一个有效索引值。

朋友源代码里定义了一个字段,一个类字段,一个实例字段。统统fields_count为3。查看对应字节码文件的16进制表示0×0003=3。

本文来自云栖社区公司商务合作 伙伴“Java杂记”,了解相关信息还也能 关注“Java杂记”。



ACC_SUPER 标志用于取舍该 Class 文件里边的 invokespecial 指令使用的是哪并都在执行语义。目前 Java 虚拟机的编译器都应当设置你你这一标志。ACC_SUPER 标记是为了向后兼容旧编译器编译的 Class 文件而占据 的,在 JDK1.0.2 版本完后 的编译器产生的 Class 文件中,access_flag 里边那末 ACC_SUPER 标志。同去,JDK1.0.2 前的 Java 虚拟机遇到 ACC_SUPER 标记会自动忽略它。

朋友代码那末接口,统统朋友的字节码文件里那末这项了。统统 interfaces_count 里边就直接是字段计数器和字段表。

u2 descriptor_index;

u2 access_flags;

2

3