Java字节码结构剖析二:字段表
access_flags
访问标志信息包括该class文件是类还是接口,是否定义成public,是否是abstract,如果是类,是否被申明为final。access_flags 的取值范围和相应含义见下表。
我们的字节码里该位置的16进制表示是0×0021。0×0021=0×0001 ^ 0×0020。即代表该类的访问修饰是public的。ACC_SUPER这里不做介绍,看看JVM规范对他的描述,了解即可。
ACC_SUPER 标志用于确定该 Class 文件里面的 invokespecial 指令使用的是哪一种执行语义。目前 Java 虚拟机的编译器都应当设置这个标志。ACC_SUPER 标记是为了向后兼容旧编译器编译的 Class 文件而存在的,在 JDK1.0.2 版本以前的编译器产生的 Class 文件中,access_flag 里面没有 ACC_SUPER 标志。同时,JDK1.0.2 前的 Java 虚拟机遇到 ACC_SUPER 标记会自动忽略它。
this_class_name
类索引,this_class 的值必须是对 constant_pool 表中项目的一个有效索引值。constant_pool 表在这个索引处的项必须为 CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的类或接口。
在我的字节码文件中,该16进制值为0×0005=5。通过常量池信息,最终他指向的是一个utf-8字符串,com/shengsiyuan/jvm/bytecode/MyTest2。即类的全限定名。
1 2 |
|
父类索引,对于类来说,super_class 的值必须为 0 或者是对 constant_pool 表中项目的一个有效索引值。
在字节码文件中,父类索引为0x000A=10。即父类是 java/lang/Object。
1 2 |
|
接口计数器,interfaces_count 的值表示当前类或接口的直接父接口数量。
我们的代码没有实现任何接口,所以该项值为0,即0×0000。
interfaces[]
接口表,interfaces[]数组中的每个成员的值必须是一个对 constant_pool 表中项目的一个有效索引值,它的长度为 interfaces_count。
我们代码没有接口,所以我们的字节码文件里没有这项了。所以 interfaces_count 后面就直接是字段计数器和字段表。
fields_count
字段计数器,fields_count 的值表示当前 Class 文件 fields[]数组的成员个数。也就是当前类的类字段和实例字段的个数。
我们源代码里定义了3个字段,1个类字段,2个实例字段。所以fields_count为3。查看对应字节码文件的16进制表示0×0003=3。
fields[]
字段表用于描述类和接口中声明的变量。这里的字段包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量。
field_info结构格式如下:
1 2 3 4 5 6 7 |
|
access_flags 项的值是用于定义字段被访问权限和基础属性的掩码标志。access_flags 的取值范围和相应含义见如下表:
看在我字节码中的16进制表示,0×0000=0。0代表没有修饰符的意思。看我们的源码:String str = “Welcome”;,即默认修饰符。
● name_index 项的值必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一个有效的字段的非全限定名。在字节码里是0x000B=11。常量池11处:
1 |
|
表示字段的名称为“str”。
● descriptor_index 项的值必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一个有效的字段的描述符。字节码中,0x000C=12。看常量池:
1 |
|
表示该字段是String类型。
在JVM规范中,每个变量/字段都有描述信息,描述信息主要作用是描述字段的数据类型、方法的参数列表(包括数量,类型与顺序)与返回值。根据描述符规则,基本数据类型和代表无返回值的void类型都用一个大写字符来表示,对象类型则使用字符L加对象的全限定名称来表示。为了压缩字节码文件的体积,对于基本数据类型,JVM都只使用一个大写字母表示,如下所示:B-byte、C-char、D-double、F-float、I-int、J-long、S-short、Z-boolean、V-void、L-对象类型,如Ljava/lang/String。
对于数组类型来说,每一个纬度使一个前置的[表示,如int[]被记录为[I,String[][]被记录为[[Ljava/lang/String;。
在字节码里,0x0000=0。即该字段没有附加属性。
● attributes[]attributes 表的每一个成员的值必须是 attribute结构,一个字段可以有任意个关联属性。
因为该字段没有附加属性,所以这项数据没有。
以上就是字段表里的第1个字段的完整字节码信息描述。也就是我们定义的『str』字段的信息。我们代码里还有2个字段 private int x = 5 和 public static Integer in = 10。我便不再描述了,大家可以紧接着我后面把这两个字段的信息解析出来。
原文发布时间为:2018-11-22
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
程序员面试30题,你面试失败的原因都在这里!
时间飞逝,转眼间从离开百度到创办爱创课堂前端培训学校近3年了。工作也发生了巨大变化,从以前的企业项目开发到现在在学校日复一日地为学生授课,但无论对着计算机编程,还是为学生讲述前端知识,都十分让我享受。 每到毕业季,看着自己带出的学生找到理想的工作,心中亦是十分欣慰。学生求职中,经常会问我一些面试中的问题,每次耐心地帮他们解答,对他们帮助很大。 临近毕业的学生很多恐惧面试,所以在学校内部我整理了一些面试题册子与学生分享,学生受益颇多。再后来,为使在这里毕业的更多学生持续地学习更广阔的知识,爱创课堂组织了一个“爱创课堂每日一题”活动,每天推出一道与工作相关的技术问题,受到广大毕业学生好评…… 通过这些活动我认识到,不论是在面试中,还是工作中,通过学习了解确实可以避免少踩一些坑,少走一些弯路,于是我将培训学校内部用的前端面试知识,整理成一本书。 希望能够与更多的读者分享爱创课堂的知识;希望《前端程序员面试秘籍》能够帮助那些正在找工作的人顺利找到工作;也希望这本书能够帮助那些在工作中遇到问题而踌躇不前的人顺利解决问题;同时也希望这本书能够帮助那些学习前端、期望了解前端更多知识的人。 1.Jav...
- 下一篇
Java: 未来已来
在10月22的 Oracle Codeone大会上,Java 平台的首席架构师 Mark Reinhold 做了The Future of Java is Today的演讲, 回顾了最近 Java 的几个版本的新的功能,Java 的每年两次的发布周期, 澄清了关于发布流程和 Java 版本的几个误区,最后花了很大的篇幅介绍了未来 Java 几个令人非常期待的几个孵化中项目,可以为Java带来更好的生产力、性能和可扩展性。我整理了这四个项目相关的知识,你可以提前了解到 Java 未来的这些酷炫的特性。 Mark Reinhold 我不多介绍了, 之前要了解Java的未来动向看Java之父James Gosling, 他离开Oracle之后想了解Java的动向就看 Mark Reinhold。 Project Amber 提供面向生产力的 Java 特性, 比如字符串字面值、switch 表达式、模式匹配、record 等。 这个项目包含很多Java语言特性的新功能。 包括 正在实现的 ●JEP 302 Lambda Leftovers:对lambda功能的补强, 比如下划线变量等 BiF...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块