当前位置: 首页 > 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;这样的数…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...