深入理解java虚拟机:类文件结构(2)

news2024/12/26 8:54:37

文章目录

  • Class类文件结构
    • 2.6 方法表集合
    • 2.7 属性表集合
  • 3. Class文件结构的发展

Class类文件结构

接着上一篇,我们继续补充

2.6 方法表集合

Class文件存储格式中对方法的描述与对字段的描述几乎采用了完全一致的方式,方法表的结构如同字段表一样,依次包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)几项,如下表所示。这些数据项目的含义非常类似,仅在访问标志和属性表集合的可选项中有所区别。
在这里插入图片描述
因为volatiletransient不能修饰方法,所以方法表的访问标志中没有了ACC_VOLATILE标志和ACC_TRANSIENT标志。与之相对的,synchronized、native、strictfp和abstract关键字可以修饰方法,所以方法表的访问标志中增加了ACC_SYNCHRONIZED、ACC_NATIVE、ACC_STRICTFP和ACC_ABSTRACT标志。对于
方法表,所有标志位及其取值可参见下表
在这里插入图片描述
方法的定义可以通过访问标志名称索引描述索引来表达,方法中的代码可以通过Code属性来展示,具体可见属性表内容

与字段表集合相对应的,如果父类方法在子类中没有被重写(Override),方法表集合中就不会出现来自父类的方法信息。但同样的,有可能会出现由编译器自动添加的方法,最典型的便是类构造器<clinit>方法和实例构造器<init>方法。

2.7 属性表集合

属性表(attribute_info),在Class文件、字段表、方法表中都可以携带自己的属性表集合,以用于描述某些场景专有的信息。

任何人实现的编译器都可以向属性表中写人自己定义的属性信息,Java虚拟机运行时会忽略掉它不认识的属性。为了能正确地解析Class文件,《Java虚拟机规范(第2版)》中预定义了9项虚拟机实现应当能识别的属性,具体如下表所示。

在这里插入图片描述

Code属性

Java程序方法体里面的代码经过Javac编译器处理之后,最终变为字节码指令存储在Code属性内。Code属性出现在方法表的属性集合之中,但并非所有的方法表都必须存在这个属性,譬如接口或抽象类中的方法就不存在Code属性,如果方法表有Code属性存在,那么它的结构将如下表所示。

在这里插入图片描述
attribute_name_index是一项指向CONSTANT_Utf8_info型常量的索引,常量值固定为“Code”,它代表了该属性的属性名称,attribute_length指示了属性值的长度,由于属性名称索引与属性长度一共是6个字节,所以属性值的长度固定为整个属性表的长度减去6个字节。

max_stack代表了操作数栈(Operand Stacks)深度的最大值

max_locals代表了局部变量表所需的存储空间

code_lengthcode用来存储Java源程序编译后生成的字节码指令,code_length代表字节码长度,code用于存储字节码指令的一系列字节流

 Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: getfield      #2                  // Field m:I
         4: iconst_1
         5: iadd
         6: ireturn
      LineNumberTable:
        line 12: 0

Exceptions属性

Exceptions属性的作用是列举出方法中可能抛出的受查异常(Checked Excepitons),也就是方法描述时在throws关键字后面列举的异常。它的结构如下表所示

在这里插入图片描述
此属性中的number_of_exceptions项表示方法可能抛出number_of_exceptions种受查异常,每一种受查异常使用一个exception_index_table项表示,exception_index_.table是一个指向常量池中CONSTANT_Class_info型常量的索引,代表了该受查异常的类型

LineNumberTable属性

LineNumberTable属性用于描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系。它并不是运行时必需的属性,但默认会生成到Class文件中,可以使用javac -g:none or -g:lines选项来取消或要求生成这项信息

LocalVariableTable属性

LocalVariableTable属性用于描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的关系,它不是运行时必需的属性,默认也不会生成到Class文件之中。可以使用Javac的-g:none或-g:source选项来关闭或要求生成这项信息。与LocalVariableTypeTable是一致的

SourceFile属性

SourceFile属性用于记录生成这个Class文件的源码文件名称。这个属性也是可选的,可以使用Javac的-g:none或-g:source选项来关闭或要求生成这项信息。

ConstantValue属性

Constant Value属性的作用是通知虚拟机自动为静态变量赋值。只有被static关键字修饰的变量(类变量)才可以使用这项属性。在Java程序里面类似“intx=l23”和“static int x=123”这样的变量定义是非常常见的事情,但虚拟机对这两种变量赋值的方式和时刻都有所不同。对于非static类型的变量(也就是实例变量)的赋值是在实例构造器<init>方法中进行的;而对于类变量,则有两种方式可以选择:赋值在类构造器<clinit>方法中进行,或者使用Constant Value属性来赋值。

如果同时使用final和static来修饰一个变量(或者说常量更贴切),并且这个变量的数据类型是基本类型或java.lang.String的话,就生成Constant Value属性来进行初始化,如果这个变量没有被final修饰,或者并非基本类型及字符串,则选择在<clinit>方法中进行初始化。

InnerClasses属性

InnerClasses属性用于记录内部类与宿主类之间的关联。如果一个类中定义了内部类,那编译器将会为它及它所包含的内部类生成InnerClasses属性。

Deprecated及Synthetic属性

Deprecated和Synthetic两个属性都属于标志类型的布尔属性,只存在有和没有的区别,没有属性值的概念。

Deprecated属性用于表示某个类、字段或方法,已经被程序作者定为不再推荐使用,它可以通过在代码中使用@deprecated注释进行设置。

Synthetic属性代表此字段或方法并不是由Java源码直接产生的,而是由编译器自行添加的,在JDK1.5之后,标识一个类、字段或方法是编译器自动产生的

3. Class文件结构的发展

Class文件结构自Java虚拟机规范第一版订立以来,已经有十多年的历史。这十多年间,Java技术体系有了翻天覆地的改变,相对于语言、API及Java技术体系中其他方面的变化,Class文件结构一直处于一个相对比较稳定的状态,Class文件的主体结构几乎没有发生过变化,对Class文件格式的改进都集中在向访问标志属性表这些在设计上本就可扩展的数据结构中添加内容。

而属性表集合中,在JDK1.5和JDK1.6版本内一共增加了10项新的属性。这些属性的名称及具体作用可以参见下表

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法设计与分析 SCAU17964 水桶打水

17964 水桶打水 时间限制:1000MS 代码长度限制:10KB 提交次数:25 通过次数:9 题型: 编程题 语言: G;GCC;VC;JAVA Description 有n个人&#xff08;n<100000&#xff09;带着大大小小的水桶容器&#xff08;每人一个水桶&#xff09;排队到r个&#xff08;r<1000&#…

JS基础习题

1.JavaScript变量命名规则 1.在JavaScript中以下&#xff0c;以下哪些变量名是非法的&#xff08;会导致程序报错&#xff09;&#xff1f; 1person name var $orderwera23 uiuiuqwer4_23aser2 A .1person&#xff0c;name B .name&#xff0c;var C .$orderwera23&#xff0c…

怎么自制小程序?【自己制作小程序】

说到制作小程序&#xff0c;有些动手能力比较强的小伙伴可能就在想怎么自制小程序。想自制小程序&#xff0c;至少也是需要会一些编程代码的&#xff0c;如果不懂代码就只能找其他方法了。那么怎么自制小程序呢&#xff1f; 现在市面上有很多的小程序制作工具&#xff0c;可以…

hexo建站新手入门

Hexo是一款基于Node.js的静态博客框架&#xff0c;依赖少易于安装使用&#xff0c;可以方便的生成静态网页托管在GitHub和Coding上&#xff0c;是搭建博客的首选框架。 hexo史上最全搭建教程 Hexo搭建步骤 安装Git安装Node.js安装HexoGitHub创建个人仓库生成SSH添加到GitHub…

几分钟让你了解Linux下文件权限掩码及作用

在说文件权限掩码之前&#xff0c;必须了解下linux下的文件权限&#xff0c;比如在linux下可以通过“ls -l”命令查看文件的权限&#xff0c;输入后可以获得如下显示&#xff1a; drwxrwxr-x 3 linux linux 4096 Jun 6 18:03 test 在显示中“drwxrwxr-x”这十个字母中第一个字母…

数据分析入门必看|数据分析到底应该学什么?

数据分析在工作和学习中用到的越来越多&#xff0c;以前也成体系的分享了一些内容&#xff0c;详情参考链接&#xff1a;数据分析系列 1/32 | 数据分析入门理解。在之前的分享内容里&#xff0c;是为了让大家更快上手入门去学习使用的&#xff0c;本次内容合计里&#xff0c;每…

知乎转发最高的 Java 面试成神笔记,GitHub 已下载量已过百万

在某论坛上面对于“中国程序员数量是否已经饱和或者过剩”这个话题很火&#xff01; 今年大家都有一个共同的感受&#xff1a;工作不好找&#xff0c;薪资不理想&#xff0c;面试造火箭。 其实&#xff0c;由于不仅是因为今年受疫情影响&#xff0c;很多公司经营不下去&#xf…

防不胜防?网络钓鱼攻击常用手法盘点与防护建议

【环境搭建资料、工具包、全套视频…等籽料】私信聆取 网络钓鱼攻击是最常见、最容易让受害者中招的网络犯罪之一&#xff0c;随着网络技术的不断发展&#xff0c;攻击者的伪装手段也变得愈发狡诈&#xff0c;攻击频次也再增高&#xff0c;各种新奇的攻击方式层出不穷。有些攻…

day30 SQL注入CTF二次堆叠DNS带外

二次注入 原理 二次注入是存储型注入&#xff0c;可以理解为构造恶意数据存储在数据库后&#xff0c;恶意数据被读取并进入到了SQL查询语句所导致的注入。恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中&#xff0c;当Web程序调用存储在数据库中的恶意数据并执行…

成都地区一汽大众汽车4s店营销策略研究

目 录 第一章 绪论 1 1.1选题及意义 1 1.2 国内外现状 1 1.3研究主要内容 3 1.4研究方法 3 第二章 成都地区一汽大众汽车4S店营销市场调查分析 4 2.1调查目的 4 2.2调查过程 4 2.3数据分析与调查结果 4 2.4启示与思考 8 第三章 成都地区一汽大众汽车4S店SWOT分析 9 3.1成都地区…

过五关,斩六将!「网易/美团/菜鸟」已拿offer【Java岗】

经过两个月的辛苦奋战&#xff0c;最终拿到了网易、头条、字节、菜鸟的offer&#xff0c;感觉面试的时候还是很幸运的&#xff0c;很多题都是我之前刷题刷到过的&#xff0c;哈哈哈~~下面给广大网友们分享一下我的面经&#xff08;网易/美团/菜鸟&#xff09;供大家参考参考...…

python教程:*的用法,你可能错过了......

人生苦短&#xff0c;我用python python中*是非常常见的一个运算符&#xff0c;它主要有以下几个功能&#xff1a; 乘法运算符&#xff1b; 函数形参表示可变参数&#xff1b; 函数实参代表tuple&#xff1b; 序列解包为tuple&#xff1b; zip解包运算&#xff1b; 更多学习干…

SpringCloud学习笔记 - 消息总线 - Spring Cloud Bus

1. 消息总线简介 消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅&#xff0c;当该消息主题产生消息时会被所有微服务实例监听和消费。 消息代理又是什么&#xff1f;消息代理是一个消息验证、传输、路由的架构模式&#xff0c;主要用来实现接收和分发消息&…

Java EE|进程与线程的区别与联系

大数据时代&#xff0c;数据规模非常庞大&#xff0c;所以我们在实际开发过程中&#xff0c;需要经常进行并发问题的处理。对于此问题&#xff0c;我们通常有两种解决方案&#xff1a;多进程方式和多线程方式。但是由于多进程对于资源的共享非常困难&#xff0c;而多线程并发可…

一个宁静祥和没有bug的下午和SqlSession的故事

作者&#xff1a;马跃 1 背景 这是一个安静祥和没有bug的下午。 作为一只菜鸡&#xff0c;时刻巩固一下基础还是很有必要的&#xff0c;如此的大好时机&#xff0c;就让我来学习学习mybatis如何使用。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(i…

模拟退火--学习笔记

模拟退火算法来源&#xff1a; 固体退火原理&#xff0c;将固体加温至充分高&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;而徐徐冷却时粒子渐趋有序&#xff0c;在每个温度都达到平衡态&#xff0c…

【图神经网络论文整理】(三)—— HOW TO FIND YOUR FRIENDLY NEIGHBORHOOD:SuperGAT

ICLR 2021Dongkwan Kim & Alice Oh论文地址 本文介绍的论文是《HOW TO FIND YOUR FRIENDLY NEIGHBORHOOD: GRAPH ATTENTION DESIGN WITH SELF-SUPERVISION》。 该篇论文提出了一个新的网络模型SuperGAT&#xff0c;目的是解决当图中存在噪声能够学习到更多的表达注意力&a…

实体店做微信商城小程序制作步骤_分享微信商城小程序的作用

各行各业都在用微商城小程序开店&#xff0c;不管是餐饮店还是便利店&#xff0c;还是五金店。都是可以利用微信小程序开一个线上店铺。实现线上跟线下店铺更加全面的结合。维护好自己的老客户。让您的客户给您拉新&#xff0c;带来新客户。 小程序经过这几年的快速发展和不断升…

计算机毕业设计之java+ssm企业销售管理系统

项目介绍 本企业销售管理系统主要包括系统用户管理模块、商品信息模块、进货入库管理、员工信息管理、销售管理、登录模块、和退出模块等多个模块系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统是独立的运行&#xff0c;不依附于其他系统&#xff0c…

Day4:写前端项目(html+css+js)

xiao效果&#xff1a; 页面布局 使用grid <div class"grid-container"><div><h1 class"uppercase ff-sans-cond letter-spacing-2 text-accent"> so, you want to travel to<span class"uppercase letter-spacing-2 fs-900 te…