当前位置: 首页 > news >正文

JVM学习-Class文件结构②

访问标识(access_flag)
  • 在常量池后,紧跟着访问标记,标记使用两个字节表示,用于识别一些类或接口层次的访问信息,包括这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话,是否声明为final等,各种访问标记如下:
    在这里插入图片描述
  • 类的访问权限通常为ACC_开头的常量
  • 每一种类型的表示都是通过设置访问标记的32位中的特定位来实现的,比如,若是public final的类,则该标记为ACC_PUBLIC | ACC_FINAL
  • 使用ACC_SUPER可以让类更准确地定位到父类的方法super.method(),现代编译器都会设置并且使用这个标记
  • 带有ACC_INTERFACE标志的class文件表示是接口不是类,反之则表示是类而不是接口
  • 如果一个class文件被设置了ACC_INTERFACE标志,那么同时也得设置ACC_ABSTRACT标志,同时不能设置ACC_FINAL、ACC_SUPER或ACC_ENUM标志
  • 如果没有设置ACC_INTERFACE标志,那么这个class文件可以具有上表中除ACC_ANNOTATION外的其他所有标志,当然ACC_FINAL和ACC_ABSTRACT这类互斥的标志除外,这两个标志不能同时设置
  • ACC_SUPER标志用于标志用于确定类或接口里面的invokespecial指令使用的哪一种执行语义,针对Java虚拟机指令集的编译器都应设置这个标志,对于Java SE8及后续版本来说,无论class文件中这个标志的实际值是什么,也不管class文件的版本是多少,Java虚拟机会为每个class文件均设置ACC_SUPER标志
  • ACC_SUPER标志为了向后兼容由旧Java编译器所编译的代码而设计,目前的ACC_SUPER标志在由JDK1.0.2之前的编译器生成的access_flags中没有确定意义,如果设置该标志,oracle的JVM实现会将其忽略
  • ACC_SYNTHETIC标志意味着该类或接口是由编译器生成的,而不是由源代码生成的
  • 注解类型必须设置为ACC_ANNOTATION标志,如果设置了ACC_ANNOTATION标志,那么也必须设置ACC_INTERFACE标志
  • ACC_ENUM标志表明该类或其父类为枚举类型
  • 表中没有使用的Access_flags标志为未来扩充预留,这些预留标志在编译器中应该设置为0,JVM实现也应忽略他们
类索引、父类索引、接口索引集合
  • 在访问标记后,会指定该类的类别、父类类别及实现的接口,格式如下
    在这里插入图片描述
  • 这三项数据来确认这个类的继承关系
  • 类索引用于确定这个类的全限定名
  • 类索引用于确定这个类的父类的全限定名,由于Java语言不允许多重继承,父类索引只有一个,除java.lang.Object除外,所有的Java类都有父类,除java.lang.Object外,所有Java类的父类索引都不为0
  • 接口索引集合就用来描述这个类实现了哪些接口,这些被实现的接口按implements语句(如果类本身为接口,则应使用extends语句)后的接口顺序从左到右排列在接口索引集体中
类索引this_class

2字节无符号整数,指向常量池的索引,它提供了类的全限定名,如com/chapter09/Demo,this_class的值必须是对常量池表中某项的一个有效索引,常量池在这个索引处的成员都必须为CONSTANT_Class_info类型结构体,该结构表示这个class文件所定义的类或接口

父类索引super_class
  • 2字节无符号整数,指向常量池的索引,它提供了父类的全限定名,如无继承关系,其默认继承java/lang/Object类,由于Java不支持多继承,其父类只有一个
  • superclass指向的父类不能是final
interfaces
  • 指向常量也索引集合,它提供了一个符号引用到所有已实现的接口
  • 由于一个类可以实现多个接口,因此需要以数组形式保存多个接口的索引,表示接口的第个索引也是一个指向常量池的CONSTANT_Class(此处必须是接口,不是类)
  • interfaces_count接口计数器
    interfaces_count项的值表示当前类或接口的直接超接口数量
  • interfaces[]接口索引集合
    interfaces[]中每个成员的值必须是对常量池表中某项的有效索引值,它的长度为interfaces_count,每个成员interfaces[i]必须为CONSTANT_Class_info结构,其中0 <= i < interfaces_count,在interfaces[]中,各成员所表示的接口顺序和对应的源代码中给定的接口顺序一样,即interfaces[0]对应的是源代码中最左边的接口
字段表集合
  • 用于描述接口或类声明的变量,字段(field),包括类级变量以及实例级变量,但不包括方法内部、代码块内部声明的局部变量
  • 字段叫什么名字、字段定义的是什么数据类型,这此都是无法固定的,只能引用常量池中的常量来描述
  • 它指向常量池索引集合,它描述了每个字段的完整信息,比如字段的标识符、访问修饰符(public,private,protected),是类变量还是实例变量(static修饰符),是否是常量(final修饰符)等
    注:
  • 字段表集体中不会列出从父类或者实现接口中继承而来的字段,但有可能列出原本Java代码中不存在的字段,譬如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段
  • 在Java语言中字段是无法重载的,两个字段的数据类型、修饰符不管是否相同,都必须使用不一样的名称,但是对于字节码来讲,如果两个字段的描述符不一致,那字段重名就是合法的
字段计数器fields_count
  • fields_count的值表示当前class文件fields表的成员个数,使用两个字节来表示
  • fields表中线个成员都是一个field_info结构,用于表示该类或接口所声明的所有类字段或实例字段,不包括方法内部声明的变量,也不包括从父类或父接口继承的那些字段
字段表fields[]
  • fields表中的每个成员都必须是一个fields_info结构的数据项,用于表示当前类或接口中某个字段的完整描述
  • 一个字段的信息包括如下这些信息,这些信息中,各个修饰符都是布尔值,要么有,要么没有
  • 作用域(public,private,protected修饰符)
  • 是实例变量还是类变量(static修饰)
  • 可变性(final)
  • 并发可见性(volatile修饰,是否强制从 内存读写)
  • 可否序列化(transient修饰)
  • 字段数据类型(基本数据类型、对象、数组)
  • 字段名称
  • 字段表结构
    在这里插入图片描述
字段表访问标识

一个字段可以被各种关键字去修饰,如作用域修饰符(public,private,protected)、static修饰符、final修饰、volatile修饰符等,因此,其可像类的访问标志那样,使用一些标志来标记字段,字段的访问标志有如下:
在这里插入图片描述

字段名索引
  • 根据字段名索引的值,查询常量池中的指定索引项即可
描述符索引
  • 描述符的作用用来描述字段的数据类型、方法的参数列表和返回值,根据描述符规则,基本数据类型及代表无返回值的void类型都用一个大写字符来表示,而对象用L加对象的全限定名来表示,如下:
    在这里插入图片描述
属性表集合
  • 一个字段还可能拥有一些属性,用于存储更多的额外信息,比如初始化值、一些注释信息等,属性个数存放在Attribute_count中,属性具体内容存放在attributes数组中
//以常量属性为例
ConstantValue_attribute {u2 attribute_name_index;u4 attribute_length;u2 constantvalue_index;
}
//说明常量属性而言,attribute_length的值恒为2
方法表集合
属性表集合

待续… …

相关文章:

JVM学习-Class文件结构②

访问标识(access_flag) 在常量池后&#xff0c;紧跟着访问标记&#xff0c;标记使用两个字节表示&#xff0c;用于识别一些类或接口层次的访问信息&#xff0c;包括这个Class是类还是接口&#xff0c;是否定义为public类型&#xff0c;是否定义为abstract类型&#xff0c;如果…...

数据库连接项目

MySQL...

MySQL--InnoDB体系结构

目录 一、物理存储结构 二、表空间 1.数据表空间介绍 2.数据表空间迁移 3.共享表空间 4.临时表空间 5.undo表空间 三、InnoDB内存结构 1.innodb_buffer_pool 2.innodb_log_buffer 四、InnoDB 8.0结构图例 五、InnoDB重要参数 1.redo log刷新磁盘策略 2.刷盘方式&…...

ffplay 使用文档介绍

ffplay ffplay 是一个简单的媒体播放器,它是 FFmpeg 项目的一部分。FFmpeg 是一个广泛使用的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有类型的媒体文件。 ffplay 主要用于测试和调试,因为它提供了一个命令行界面,可以方便地查看媒体文件的…...

四种网络IO模型

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 IO的定义 IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存&#xff0c;在…...

Mixed-precision计算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…...

Go 控制协程(goroutine)的并发数量

在使用协程并发处理某些任务时, 其并发数量往往因为各种因素的限制不能无限的增大. 例如网络请求、数据库查询等等。 从运行效率角度考虑&#xff0c;在相关服务可以负载的前提下&#xff08;限制最大并发数&#xff09;&#xff0c;尽可能高的并发。 在Go语言中&#xff0c;…...

web安全渗透测试十大常规项(一):web渗透测试之CSRF跨站请求伪造

渗透测试之CSRF跨站请求伪造 CSRF跨站请求伪造 CSRF跨站请求伪造...

YOLOv10尝鲜测试五分钟极简配置

最近清华大学团队又推出YOLOv10&#xff0c;真是好家伙了。 安装&#xff1a; pip install supervision githttps://github.com/THU-MIG/yolov10.git下载权重&#xff1a;https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10n.pt 预测&#xff1a; from ult…...

社交媒体数据恢复:聊天宝

请注意&#xff0c;本教程仅针对聊天宝应用程序&#xff0c;而非其他聊天软件。以下是详细的步骤&#xff1a; 首先&#xff0c;请确保您已经登录了聊天宝应用程序。如果您尚未登录&#xff0c;请使用您的账号登录。 在聊天宝主界面&#xff0c;找到您希望恢复聊天记录的对话框…...

备战秋招—模拟版图面试题来了

随着暑期的脚步逐渐临近&#xff0c;电子工程和集成电路设计领域的毕业生们&#xff0c;也将迎来了另一个求职的黄金期——秋招。我们总说机会是留给有准备的人。对于有志于投身于模拟版图设计的学子们来说&#xff0c;为了在众多求职者中脱颖而出&#xff0c;充分备战模拟版图…...

CAN总线简介

1. CAN总线概述 1.1 CAN定义与历史背景 CAN&#xff0c;全称为Controller Area Network&#xff0c;是一种基于消息广播的串行通信协议。它最初由德国Bosch公司在1983年为汽车行业开发&#xff0c;目的是实现汽车内部电子控制单元&#xff08;ECUs&#xff09;之间的可靠通信。…...

【HSQL001】HiveSQL内置函数手册总结(更新中)

1.熟悉、梳理、总结下Hive SQL相关知识体系。 2.日常研发过程中使用较少&#xff0c;随着时间的推移&#xff0c;很快就忘得一干二净&#xff0c;所以梳理总结下&#xff0c;以备日常使用参考 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 文章目录 1.函数清单 1.函数清…...

Rust面试宝典第14题:旋转数组

题目 给定一个数组&#xff0c;将数组中的元素向右移动k个位置&#xff0c;其中k是非负数。要求如下&#xff1a; &#xff08;1&#xff09;尽可能想出更多的解决方案&#xff0c;至少有三种不同的方法可以解决这个问题。 &#xff08;2&#xff09;使用时间复杂度为O(n)和空间…...

解决SpringBoot中插入汉字变成?(一秒解决)

在这里url后面加一行配置即可&useUnicodetrue&characterEncodingUTF-8即可 解释 spring.datasource.url: 这里包含了数据库的URL&#xff0c;以及额外的参数如useUnicodetrue用于启用Unicode字符集支持&#xff0c;characterEncodingUTF-8用于指定字符编码为UTF-8&…...

5.26牛客循环结构

1002. 难点&#xff1a; 两层循环条件设置 思路 可以设置三个变量 代码 1003 思路&#xff1a; 与星号双塔差不多&#xff0c;在此基础上加大一点难度 每日练题5.23 &#xff08;EOF用法&#xff09;-CSDN博客 代码 1004 代码...

AIGC 004-T2I-adapter另外一种支持多条件组合控制的文生图方案!

AIGC 004-T2I-adapter另外一种支持多条件组合控制的文生图方案&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 T2I-Adapter 论文提出了一种名为 T2I-Adapter 的轻量级适配器模块&#xff0c;旨在增强文本到图像 (T2I) 扩散模型的语义理解和生成能力。 论文指出…...

详解 Cookies 和 WebStorage

Cookies 和 WebStorage Cookies 和 WebStorageCookies简要介绍操作 Cookies&#xff08;document.cookie&#xff09;不足之处 WebStorage简要介绍LocalStorage Vs. SessionStorage操作 WebStorage 三种数据存储方式的对比分析共性差异 REFERENCES Cookies 和 WebStorage Cook…...

BeanFactory、FactroyBean、ApplicationContext

BeanFactory Ioc容器、定义接口规范来管理spring bean的生命周期、依赖、注入&#xff0c;spring中有各种Ioc容器 FactroyBean 定制的工厂Bean&#xff0c;可以通过抽象工厂方式创建的bean&#xff0c;不纳入spring的生命周期、依赖、注入特性&#xff0c;相当于spring给第三…...

【计算机网络】HTTPS 协议原理

加密 1. 加密概念 加密就是把明文 (要传输的信息)进行一系列变换&#xff0c;生成密文。 解密就是把密文再进行一系列变换&#xff0c;还原成明文。 在这个加密和解密的过程中&#xff0c;往往需要⼀个或者多个中间的数据&#xff0c;辅助进行这个过程&#xff0c;这样的数…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...