JVM-class文件完全解析-字段表集合
字段表集合
这个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文件完全解析-字段表集合相关推荐
- java图的建立field_《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的...
0.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述 ...
- JVM虚拟机-Class文件之字段表集合
一.概述 在接口索引集合后面 的就是字段表集合了.字段表(field_info)用于描述接口或者类中声明的变量.字段包括类级变量以及实例级变量,但是不包括在方法内部声明的局部变量. 二.字段表集合的构 ...
- JVM-class文件完全解析-方法表集合
方法表集合 前面的魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引,接口索引集合,字段表集合,那么再接下来就是方法表了. 方法表的构造如同字段表一样,依次包括了访问标志(a ...
- jvm中篇-04-Javap指令解析class文件
jvm中篇-04-Javap指令解析class文件 解析字节码的作用 javac -g 操作 javap 的具体用法 使用举例 小结 234-237 解析字节码的作用 通过反编译生成的字节码文件,我们 ...
- Jvm之用java解析class文件
前言: 身为一个java程序员,怎么能不了解JVM呢,倘若想学习JVM,那就又必须要了解Class文件,Class之于虚拟机,就如鱼之于水,虚拟机因为Class而有了生命.<深入理解java虚拟 ...
- The JVM Architecture Explained-JVM架构解析(译)
2019独角兽企业重金招聘Python工程师标准>>> 翻译原文:https://dzone.com/articles/jvm-architecture-explained JVM架 ...
- JVM探究:全面解析OOM异常,都在这了,java面试问题大全及答案大全word
查看下从 GC 根元素到内存消耗聚集点的最短路径,在Shortest Paths To the Accumulation Point(GC root到聚集点的最短路径,就是持有可能泄漏内存对象的最近一 ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )
文章目录 前言 一.字段表总数据结构 二.访问标志 三.字段名称 四.字段描述符 五.属性项目数 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 三 ( 访问和修饰标志 | ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )
文章目录 前言 一.访问和修饰标志 二.类索引 三.父类索引 四.接口计数器 五.接口表 六.字段计数器 七.字段表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( ...
最新文章
- Java中主线程如何捕获子线程抛出的异常
- idea加入springboot插件_带你搭一个SpringBoot+SpringData JPA的环境
- mysql 查找密码忘记,Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
- SAP Spartacus 如何取得某个table字段对应的Angular Component
- MFC程序执行过程剖析
- 洛谷P1534题解(Java语言描述)
- Opencv--addWeighted()
- python比较两个列表的重合度_#源代码#超几何分布算法介绍及python下的实现代码...
- java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询
- android动画水波纹外扩,Android实现水波纹扩散效果
- 金庸群侠传苍龙逐日1.2-szlzw手机移植版攻略
- 计算机用户 图片存储位置,电脑版微信图片存在哪里?存储地址是什么?
- Hadoop研发工程师_岗位职责和技能要求
- 单片机8位共阴极数码管0~99自增
- 高德地图路径轨迹起点标点不变_竞品分析之高德地图与百度地图
- Install SVN Error:The Feature You Are Tring to Use is on a Network Resource That is Unvaliable
- JavaScript的map方法
- 苹果企业签名证书制作详解
- 自定义View入门 --转载自武老师博客160303
- 打开、关闭系统软键盘(触摸屏)
热门文章
- abaqus dat文件 matlab_基于MPCCI的FLUENT与ABAQUS流固耦合分析步骤
- eclipse优化运行速度_IPFS:强化公共DHT以抵抗eclipse攻击
- SpringBoot项目热部署配置
- 百度深度学习初级工程师认证划水贴
- usb耳机android,USB 耳机:配件规范 | Android 开源项目 | Android Open Source Project...
- tesseract如何在Linux下卸载,Tesseract装配
- oracle总是未响应,求教 pl/sql连接本机数据库是未响应问题
- python鼠标位置_用python3 返回鼠标位置的实现方法(带界面)
- php 字符串hash比较,分析两个 url 查询字符串和 hash 的区别
- 线段树i hate it