class属性表种类集合,以及字段详解

目录:
java虚拟机汇总

  1. class文件结构分析
    1).class文件常量池中的常量项结构
    2). 常用的属性表的集合<<== 现在位置
  2. 类加载过程
    1).类加载器的原理以及实现
  3. 虚拟机结构分析
    1).jdk1.7和1.8版本的方法区构造变化
    2).常量池简单区分
  4. 对象结构分析
    1).压缩指针详解
  5. gc垃圾回收
  6. 对象的定位方式

在Class文件,字段表,方法表都可以有属性表数组,属性表中不要求有严格的顺序,下面是所有虚拟机的属性表的类型在这里笔者只列举出常用的几个,如果想要全部的信息 =》参考文章,自认为写的很详细

在这里插入图片描述
其实所有的这些类型都有共同的结构,如下图
在这里插入图片描述
如果开始了一个属性表
则前两个字节(attrubite_name_index)一定是引向常量池的第n个常量项,一个utf8类型的字符串,例如:Code,SourceFile,Synthetic,用来明确这个属性表的类型,

然后紧跟着4个字节(attrubite_length)就是该属性表的剩余长度,比如整张属性表有30个字节,
则前面的2字节名字+4字节长度+该属性表的剩余长度 =30,这4个字节就是00 00 00 18,24个字节

然后下面的就是我们的(例)24个字节,分不同类型的属性表进行讲解

下面一个一个分析

Code属性表(很重要的表)

Code属性出现在方法表的属性集合之中(不包括抽象类或接口的方法),存放着我们方法体内的所有操作,Code属性表结构如下图
在这里插入图片描述
前面的6个字节都是一样的意义,,就不说了
1.max_stack
代表了操作数栈(Operand Stacks)深度的最大值。在方法执行的任意时刻,操作数栈都不会超过这个最大值。虚拟机运行的时候需要根据这个值来分配栈帧(Stack Frame)中的操作栈深度(具体的等我们讲到后面,进入jvm时再讲,有个印象即可)
2.max_locals
局部变量表所需要的存储空间。单位是Slot
3.code_length
字节码长度,
4.code
编译后生成的字节码指令,长度上面已经指出
5.exception_table_length&&exception_table
length就不说了,长度
接下来exception_table类型包含4个字段(start_pc、end_pc、handler_pc、catch_type)。这些字段的含义是:当字节码在start_pc行到end_pc行之间(try的范围)出现了类型为catch_type的异常或其子类的异常(catch_type为指向一个CONSTANT_Class_info型常量的索引),则跳转到handler_pc行继续处理。
再具体到每一个exception_table里面的每一个内容,我们不必那么详细,如果有需求者可以百度
6…另一个属性表
不详细说

SourceFile属性

SourceFile属性用于记录生成这个Class文件的源码名称。这个属性也是可选的,这个属性是一个定长的属性,其结构如下:

SourceFile属性表结构
在这里插入图片描述
 sourcefile_index数据项时指向常量池中CONSTANT_Utf8_info型常量的索引,常量值是源码文件名
 一句话:就是出错时报错会显示哪个类,如果没有此项,不显示类

ConstantValue属性

ConstantValue属性的作用是通知虚拟机自动为静态变量赋值。只有被static修饰的变量才可以使用这个属性。

InnerClasses属性

InnerClasses属性用于记录内部类和宿主类之间的关系。如果一个类中定义了内部类,那编译器将会为它以及它包含的内部类生成InnerClasses属性,该属性结构如下图所示:
innerClass表结构
在这里插入图片描述
数据项number_of_classes代表需要记录多少个内部类信息,每个内部类的信息都由一个inner_classes_info表进行描述,inner_classes_info表结构如下:
在这里插入图片描述
前三个不说了,就是引向常量池中的常量项
inner_class_access_flags:内部类的访问标志,它的取值范围见下表:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lioncatch/article/details/105966782
今日推荐