栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java ClassFile的结构

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java ClassFile的结构

ClassFile结构


我们看到这便来看看这都是什么意思?

第一个我们都不是很陌生

magic

魔数 CAFFBABE

minor_version, major_version

这个类文件的次要版本号和主要版本号。主版本号和次版本号共同决定类文件格式的版本。如果一个类文件有主版本号 m 和次版本号 m,我们将其类文件格式的版本表示为 m.m。

来看看JDK的支持版本

对于major_version为56或以上的类文件,minor_version必须为0或65535。

对于major_version在45到55之间的类文件,minor_version可以是任何值。

符合 Java SE n (n ≥12)的 Java 虚拟机实现必须具有以下行为:

  1. 一个类文件依赖于 javase n 的预览特性,只有在启用 javase n 的预览特性时才能加载它。
  2. 决不能加载依赖于另一个 javase 版本的预览特性的类文件。
  3. 不管是否启用了Java SE N的预览特性,都可以加载不依赖于任何Java SE发行版预览特性的类文件。
constant_pool_count

constant_pool_count项的值等于constant_pool表中的条目数加1。一个constant_pool索引被认为是有效的

如果它大于0并且小于constant_pool_count,除了提到的long和double类型的常量。

The CONSTANT_Long_info and CONSTANT_Double_info Structures

所有8字节常量在类文件的constant_pool表中占据两个单位。

tag

结构体的标签

high_bytes, low_bytes

high_bytes 优先进行存储

constant_pool[]

constant_pool是一个结构表,表示各种字符串常量,类和接口名称,字段名称,以及其他在ClassFile结构及其子结构中引用的常量。每个constant_pool表项的格式由其第一个“标记”字节指示。

constant_pool



access_flags

Access _ flags 项的值是一个标志掩码,用于表示对此类或接口的访问权限和属性。

我们在代码中的修饰符 就是通过这个进行控制

this_class

this_class项的值必须是constant_pool表的有效索引。索引处的constant_pool条目必须是一个CONSTANT_Class_info结构,代表这个类文件定义的类或接口。

super_class

对于类,super _ class 项的值必须为零,或者必须是常量 _ pool 表的有效索引。如果 super _ class 项的值非零,则该索引处的 ConSTANT _ pool 条目必须是 ConSTANT _ class _ info 结构,表示由此类文件定义的类的直接超类。直接超类及其任何超类都不能在其 ClassFile 结构的 access _ flags 项中设置 ACC _ final 标志。

interfaces_count

类或接口类型的直接超类接口的数量

interfaces[]

interfaces数组中的每个值必须是constant_pool表的有效索引。接口[i] (0≤i < interfaces_count)的每个值处的constant_pool项必须是一个CONSTANT_Class_info结构体,该结构体表示一个接口,该接口是该类或接口类型的直接超接口,按照从左到右的顺序。

fields_count

fields_count项的值给出了fields表中field_info结构的数量。field_info结构表示由该类或接口类型声明的所有字段,包括类变量和实例变量。

fields[]

字段表中的每个值必须是一个field_info结构,该结构给出了类或接口中一个字段的完整描述。fields表只包含由这个类或接口声明的那些字段。它不包括表示从超类或超接口继承的字段的项。

Fields

access_flags 这个就是我们在日常中使用的修饰符的一些标识

methods_count

methods_count项的值给出了method_info结构在方法表中的数量。

methods[]

方法表中的每个值必须是一个method_info结构,该结构给出了该类或接口中方法的完整描述。如果在method_info结构的access_flags项中没有设置ACC_NATIVE和ACC_ABSTRACT标志,那么实现该方法的Java虚拟机指令也会被提供。

method_info结构代表了该类或接口类型声明的所有方法,包括实例方法、类方法、实例初始化方法以及任何类或接口初始化方法。方法表不包括表示从超类或超接口继承的方法的项。

attributes_count

attributes_count项的值给出了该类属性表中属性的数量。

attributes[]

属性表的每个值必须是attribute_info结构

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/695053.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号