java虚拟机规范(se8)——class文件格式(三)
4.5 字段
字段使用field_info结构来描述。
在同一个class文件中的两个字段不能有相同的名称和描述符。
结构的格式如下:
field_info {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
field_info结构中的项目如下:
access_flags
access_flags的值是标识的掩码,用于表示对该字段的访问权限和属性。表4.5-A指定了设置每个标志含义。
表 4.5-A. 字段访问和属性标识
Flag Name | Value | Interpretation |
---|---|---|
ACC_PUBLIC |
0x0001 | 申明为 public ; 可以从包外访问 |
ACC_PRIVATE |
0x0002 | 申明为private ; 仅能在定义的class中使用 |
ACC_PROTECTED |
0x0004 | 申明为protected ; 可以在子类中访问 |
ACC_STATIC |
0x0008 | 申明为static . |
ACC_FINAL |
0x0010 | 申明为final ; 对象构造好之后无法再分配 (JLS §17.5). |
ACC_VOLATILE |
0x0040 | 申明为volatile ; 不能被缓存. |
ACC_TRANSIENT |
0x0080 | 申明为transient ; 持久化对象管理器不会读和写. |
ACC_SYNTHETIC |
0x1000 | 申明为synthetic; 不是由源代码产生的 |
ACC_ENUM |
0x4000 | 申明为枚举中的一员. |
类字段可能被设置上表中的任意标志位。然而,类中的每个字段只能设置ACC_PUBLIC,ACC_PRIVATE和ACC_PROTECTED中的一个,并且ACC_FINAL和ACC_VOLATILE不能同事被设置。
接口字段必须设置ACC_PUBLIC,ACC_STATIC和ACC_FINAL标志位;可以设置ACC_SYNTHETIC标志位,除此之外的其它标志位都不能设置。
ACC_SYNTHETIC标志表明这个字段是由编译器产生的,不存在源码中。
ACC_ENUM标志表面这个字段存储枚举类型中的一个元素。
上表中没有提到的标志位都是保留的供未来使用。在生成class文件的时候,它们应该设置为0,并且java虚拟机实现应该忽略这些位。
name_index
name_index的值必须是常量池表中的有效索引。该索引处的常量池条目必须是一个CONSTANT_Utf8_info结构(4.4.7),它表示一个表示字段的有效非限定名称.
descriptor_index
descriptor_index的值必须是常量池表中的有效索引。该索引处的常量池条目必须是一个CONSTANT_Utf8_info结构(4.4.7),它表示一个有效的字段描述符(4.3.2)。
arrtibutes_count
attributes count的值指明此字段的附加属性的数量。
attributes[]
attributes表的每个值必须是一个attribute_info结构。
字段可以包含任意数量的与之关联的可选属性。
表4.7-C列出了本规范定义的属性,它们出现在field_info结构的attributes表中。
有关定义出现在field_info结构的attributes表中的属性的规则在§4.7中给出。
有关field_info结构的attributes表中的非预定义属性的规则在§4.7.1中给出。
4.6 方法
每个方法(包括每个实例初始化方法(2.9)和类或接口初始化方法(2.9))都由method_info结构描述。
同一个class文件不能有两个相同名称和描述符的方法。
method_info结构的格式如下:
method_info {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
method_info结构的项目如下:
access_flags
access_flags的值是标识的掩码,用于表示对该方法的访问权限和属性。表4.6-A指定了设置每个标志含义。
表 4.6-A. 方法访问和属性标志
标志名称 | 值 | 说明 |
---|---|---|
ACC_PUBLIC |
0x0001 | 声明 public ; 可以从包外访问. |
ACC_PRIVATE |
0x0002 | 声明 private ; 只能在定义的类中访问 |
ACC_PROTECTED |
0x0004 | 声明 protected ; 可以被子类访问 |
ACC_STATIC |
0x0008 | 声明 static . |
ACC_FINAL |
0x0010 | 声明 final ; 不能被覆盖 |
ACC_SYNCHRONIZED |
0x0020 | 声明 synchronized ;调用时使用monitor封装 |
ACC_BRIDGE |
0x0040 | 一个桥接方法, 由编译器产生 |
ACC_VARARGS |
0x0080 | 声明具有可变数量的参数 |
ACC_NATIVE |
0x0100 | 声明 native ;由java之外的语言实现 |
ACC_ABSTRACT |
0x0400 | 声明 abstract ; 不提供实现 |
ACC_STRICT |
0x0800 | 声明 strictfp ; 浮点型模式是 FP-strict. |
ACC_SYNTHETIC |
0x1000 | 声明 synthetic;源码中没有出现 |
类的方法可以具有表4.6-A中的任何标志。 但是,类的每个方法最多可以设置ACC_PUBLIC,ACC_PRIVATE和ACC_PROTECTED标志中的一个(JLS§8.4.3)。
接口方法可以具有表4.6-A中除ACC_PROTECTED,ACC_FINAL,ACC_SYNCHRONIZED和ACC_NATIVE(JLS§9.4)之外的任何标志。 在版本号小于52.0的类文件中,接口的每个方法必须设置ACC_PUBLIC和ACC_ABSTRACT标志; 在版本号为52.0或更高版本的类文件中,接口的每个方法必须只设置ACC_PUBLIC和ACC_PRIVATE标志中的一个。
如果类或接口的方法设置了ACC_ABSTRACT标志,则它不能设置任何ACC_PRIVATE,ACC_STATIC,ACC_FINAL,ACC_SYNCHRONIZED,ACC_NATIVE或ACC_STRICT标志。
每个实例初始化方法(2.9)最多可以设置一个ACC_PUBLIC,ACC_PRIVATE和ACC_PROTECTED标志,并且还可以设置其ACC_VARARGS,ACC_STRICT和ACC_SYNTHETIC标志,但不得具有表4.6-A中的任何其他标志。
类和接口的初始化方法由Java虚拟机隐式调用。 除了ACC_STRICT标志的设置外,它们的access_flags项的值被忽略。
ACC_BRIDGE标志用于指示编译器为Java编程语言生成的桥接方法。
ACC_VARARGS标志指示此方法在源代码级别采用可变数量的参数。 声明采用可变数量参数的方法必须在ACC_VARARGS标志设置为1的情况下进行编译。所有其他方法必须在ACC_VARARGS标志设置为0的情况下编译。
ACC_SYNTHETIC标志表示此方法是由编译器生成的,并且不会出现在源代码中,除非它是§4.7.8中指定的方法之一。
表4.6-A中未分配的access_flags项的所有位都保留供将来使用。 它们应该在生成的类文件中设置为零,并且应该被Java虚拟机实现忽略。
name_index
name_index项的值必须是constant_pool表的有效索引。 该索引处的constant_pool条目必须是CONSTANT_Utf8_info结构(4.4.7),表示特殊方法名称<init>或<clinit>(2.9)之一,或表示方法的有效非限定名称(4.2.2)。
descriptor_index
descriptor_index项的值必须是constant_pool表的有效索引。 该索引处的constant_pool条目必须是表示有效方法描述符的CONSTANT_Utf8_info结构(4.3.3)。
arrtibutes_count
attributes_count项的值指示此方法的其他属性的数量。
attributes[]
attributes表的每个值必须是attribute_info结构(第4.7节)。
方法可以具有与之关联的任意数量的可选属性。
表4.7-C列出了此规范定义的属性出现在method_info结构的attributes表中。
有关定义出现在method_info结构的attributes表中的属性的规则在§4.7中给出。
关于method_info结构的attributes表中的非预定义属性的规则在第4.7.1节中给出。
java虚拟机规范(se8)——class文件格式(三)的更多相关文章
- java虚拟机规范(se8)——class文件格式(四)
4.7 属性 属性用于class文件格式中的ClassFile,field_info,method_info和Code_attribute结构. 所有的属性都是下面的格式: attribute_inf ...
- java虚拟机规范(se8)——class文件格式(一)
第四章 class文件格式 本章介绍了java虚拟机的class文件格式.每一个class文件包含一个单独的类或者接口的定义.虽然类和接口不一定都定义在文件中(比如类和接口亦可以通过类加载器直接生成) ...
- java虚拟机规范(se8)——class文件格式(七)
4.7.5 Exceptions 属性 Exceptions 属性是一个变长属性,它位于 method_info(§4.6)结构的属性表中. Exceptions 属性指出了一个方法需要检查的可能抛出 ...
- java虚拟机规范(se8)——class文件格式(五)
4.7.1 定义和命名新属性 允许编译器定义和发布的class文件在class文件结构体.field_info结构体.method_info结构体和Code结构体中的attributes表中包含新的属 ...
- java虚拟机规范(se8)——class文件格式(二)
4.4 常量池 java虚拟机指令并不依赖类.接口.类实例或者数组的运行时布局.相反,指令依靠常量池中的符号信息. 所有的常量池条目都有如下的通用结构: cp_info { u1 tag; u1 in ...
- java虚拟机规范(se8)——class文件格式(六)
4.7.4 StackMapTable 属性 StackMapTable 属性是一个变长属性,位于 Code(§4.7.3)属性的属性表中.这个属性会在虚拟机类加载的类型阶段(§4.10.1)被使用. ...
- java虚拟机规范(se8)——java虚拟机结构(一)
本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第二章 虚拟机结构 本文档描述了一个抽象的虚拟机规范,并不描述 ...
- java虚拟机规范(se8)——java虚拟机结构(三)
2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...
- java虚拟机规范(se8)——java虚拟机的编译(三)
3.6 接受参数 如果n个参数传给一个实例的方法,按照约定,它们被接受并放在这个新方法创建的栈帧中的局部变量表里,在局部变量表中的序号从1到n.这些参数按照它们传递过来的顺序存放.例如: int ad ...
随机推荐
- git_clone资源获取失败解决
github上克隆一个仓库到本地,一直失败.还以为是git安装问题,卸载重装无效:又换了个大容量的磁盘目录位置:最后ECS系统也重装还是无效.. remote: Counting objects: 5 ...
- C#编程--第一天
C#编程 一. 了解C#: 1. C#的定义及其特点 2.vs的集成开发环境:熟悉了解vs2012 二.C#语言基础 1.C#项目的组成结构: .config----配置文件(存放配置参数文件) .c ...
- web笔记全
1.项目流程与数据库 1.课程体系 阶段1(服务器开发): 项目导入/数据库/JS基础/NodeJS 阶段2(前端核心技术): HTML/AJAX/CSS/bootstrap 阶段3(前端进阶技术): ...
- navigate连接不上Centos7+mariadb的问题
链接数据库时忽然遇到一个问题.Mac Navicat链接时报错Can’t connect to MySQL server on ‘xx.xx.xx.xx’ (61). PS. win版Navicat ...
- 解决git status中文路径乱码
这个问题就放一张图吧: 不过需要注意,这样设置了之后对 git status 命令输出的路径就不做转义处理了,当路径中有空格等被terminal视为特殊字符的内容时不要直接复制粘贴使用.
- 灰常牛逼的命令行备忘录 navi
灰常牛逼的命令行备忘录 navi 1. navi命令简介 1.1 navi命令简介 命令行是非常高效的工具,但一个很常见的现象是,很多命令行过一段时间就容易忘.举个栗子,如果我们常用 git 命令行管 ...
- rabbitmq AmqpClient 使用Direct 交换机投递与接收消息,C++代码示例
// 以DIRECT 交换机和ROUTING_KEY的方式进行消息的发布与订阅 // send // strUri = "amqp://guest:guest@192.168.30.11:8 ...
- JVM内存组成
JVM的内存区域模型 1.方法区 也称永久代.非堆. 用于存储虚拟机加载的类信息.常量.静态变量,是各个线程共享的内存区域. 默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize和 ...
- redis JedisConnectionException: Could not get a resource from the pool
转载:https://blog.csdn.net/testcs_dn/article/details/43052585 产生此错误的原因通常是: 一.Redis没有启动: 我自己遇到一次这样的问题.汗 ...
- 26.LockSupport线程阻塞工具
import java.util.concurrent.locks.LockSupport; /** * 线程阻塞工具类:LockSupport * 可以在线程内任意位置让线程阻塞 */ public ...