字段表集合

  这个class文件的解析,分析得有点太久了.前面介绍类魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引和接口索引集合.下面就应该到字段表集合了. 

  紧接着接口索引集合的就是字段表的集合了.

  字段表(field_info)用于描述接口或者类中声明的变量.字段包括类级变量以及实例级变量,但是不包括在方法内部声明的局部变量.

  字段表的结构:

类型     名称 数量
u2 access_flags 1
u2 name_index 1
u2 descriptor_index 1
u2 attributes_count 1
attribute_info attributes attributes_count

  字段修饰符放在access_flags项目中,它与类中的access_flags项目是非常相似的,都是一个u2的数据类型.

  字段访问标志:

标志名称 标志值 含义
ACC_PUBLIC 0x00 01 字段是否为public
ACC_PRIVATE 0x00 02 字段是否为private
ACC_PROTECTED 0x00 04 字段是否为protected
ACC_STATIC 0x00 08 字段是否为static
ACC_FINAL 0x00 10 字段是否为final
ACC_VOLATILE 0x00 40 字段是否为volatile
ACC_TRANSTENT 0x00 80 字段是否为transient
ACC_SYNCHETIC 0x10 00 字段是否为由编译器自动产生
ACC_ENUM 0x40 00 字段是否为enum

  跟随access_flags标志的是两项索引值:name_index和descriptor_index,它们都是对常量池的引用,分别代表着字段的简单名称以及字段方法和方法的描述符.

  描述符的作用是用来描述字段的数据类型,方法的参数列表(包括数量,类型以及顺序)和返回值.根据描述符规则,基本数据类型以及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符加L加对象名的全限定名来表示.

  描述符标志含义:

  

标志符 含义
B 基本数据类型byte
C 基本数据类型char
D 基本数据类型double
F 基本数据类型float
I 基本数据类型int
J 基本数据类型long
S 基本数据类型short
Z 基本数据类型boolean
V 基本数据类型void
L 对象类型

  对于数组类型,每一维度将使用一个前置的"["字符来描述.如一个定义为"java.lang.Stirng[ ]"类型的二维数组,将被记录为:"[[Ljava/lang/Stirng",一个整型数组"int[]"将被记录为"[I".

  用描述符来描述方法时,按照先参数列表,后返回值的顺序来描述,参数列表按照参数的严格顺序放在一组小括号"()"之内.

  字段表集合中不会列出从父类或者父接口中继承而来的字段,但有可能列出原来Java代码中不存在的字段,譬如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段.另外,在Java语言中字段是无法重载的,两个字段的数据类型,修饰符不管是否相同,都必须使用不一样的名称,但是对于字节码来讲,如果连个字段的描述符不一致,那字段重名就是合法的.

  下面继续前面分析的class文件:

  源文件:

  

  javap分析出来的常量池:

  

  分析:  

  从上图中分析可以看到0x00 01表示字段表数据的个数,只有一个.0x00 02表示字段表的private修饰符,从上面的字段访问标志表可以看到.0x00 05表示字段对应着第5个常量池,从javap分析出来的常量池,可以看到第5个常量池对应着m,再看源代码我们定义的字段确实就是m.0x00 06表示描述符标识,对应着第6个常量池,为I,那么在对应我们的访问标识符含义表,I 对应着int数据类型,再看源代码m的数据类型确实就是int.

转载于:https://www.cnblogs.com/lrh-xl/p/5350612.html

JVM-class文件完全解析-字段表集合相关推荐

  1. java图的建立field_《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的...

    0.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述 ...

  2. JVM虚拟机-Class文件之字段表集合

    一.概述 在接口索引集合后面 的就是字段表集合了.字段表(field_info)用于描述接口或者类中声明的变量.字段包括类级变量以及实例级变量,但是不包括在方法内部声明的局部变量. 二.字段表集合的构 ...

  3. JVM-class文件完全解析-方法表集合

    方法表集合 前面的魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引,接口索引集合,字段表集合,那么再接下来就是方法表了.   方法表的构造如同字段表一样,依次包括了访问标志(a ...

  4. jvm中篇-04-Javap指令解析class文件

    jvm中篇-04-Javap指令解析class文件 解析字节码的作用 javac -g 操作 javap 的具体用法 使用举例 小结 234-237 解析字节码的作用 通过反编译生成的字节码文件,我们 ...

  5. Jvm之用java解析class文件

    前言: 身为一个java程序员,怎么能不了解JVM呢,倘若想学习JVM,那就又必须要了解Class文件,Class之于虚拟机,就如鱼之于水,虚拟机因为Class而有了生命.<深入理解java虚拟 ...

  6. The JVM Architecture Explained-JVM架构解析(译)

    2019独角兽企业重金招聘Python工程师标准>>> 翻译原文:https://dzone.com/articles/jvm-architecture-explained JVM架 ...

  7. JVM探究:全面解析OOM异常,都在这了,java面试问题大全及答案大全word

    查看下从 GC 根元素到内存消耗聚集点的最短路径,在Shortest Paths To the Accumulation Point(GC root到聚集点的最短路径,就是持有可能泄漏内存对象的最近一 ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )

    文章目录 前言 一.字段表总数据结构 二.访问标志 三.字段名称 四.字段描述符 五.属性项目数 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 三 ( 访问和修饰标志 | ...

  9. 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )

    文章目录 前言 一.访问和修饰标志 二.类索引 三.父类索引 四.接口计数器 五.接口表 六.字段计数器 七.字段表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( ...

最新文章

  1. Java中主线程如何捕获子线程抛出的异常
  2. idea加入springboot插件_带你搭一个SpringBoot+SpringData JPA的环境
  3. mysql 查找密码忘记,Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
  4. SAP Spartacus 如何取得某个table字段对应的Angular Component
  5. MFC程序执行过程剖析
  6. 洛谷P1534题解(Java语言描述)
  7. Opencv--addWeighted()
  8. python比较两个列表的重合度_#源代码#超几何分布算法介绍及python下的实现代码...
  9. java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询
  10. android动画水波纹外扩,Android实现水波纹扩散效果
  11. 金庸群侠传苍龙逐日1.2-szlzw手机移植版攻略
  12. 计算机用户 图片存储位置,电脑版微信图片存在哪里?存储地址是什么?
  13. Hadoop研发工程师_岗位职责和技能要求
  14. 单片机8位共阴极数码管0~99自增
  15. 高德地图路径轨迹起点标点不变_竞品分析之高德地图与百度地图
  16. Install SVN Error:The Feature You Are Tring to Use is on a Network Resource That is Unvaliable
  17. JavaScript的map方法
  18. 苹果企业签名证书制作详解
  19. 自定义View入门 --转载自武老师博客160303
  20. 打开、关闭系统软键盘(触摸屏)

热门文章

  1. abaqus dat文件 matlab_基于MPCCI的FLUENT与ABAQUS流固耦合分析步骤
  2. eclipse优化运行速度_IPFS:强化公共DHT以抵抗eclipse攻击
  3. SpringBoot项目热部署配置
  4. 百度深度学习初级工程师认证划水贴
  5. usb耳机android,USB 耳机:配件规范  |  Android 开源项目  |  Android Open Source Project...
  6. tesseract如何在Linux下卸载,Tesseract装配
  7. oracle总是未响应,求教 pl/sql连接本机数据库是未响应问题
  8. python鼠标位置_用python3 返回鼠标位置的实现方法(带界面)
  9. php 字符串hash比较,分析两个 url 查询字符串和 hash 的区别
  10. 线段树i hate it