JAVA虚拟机11-Class文件结构
1.平台无关性和语言无关性
3.Class类文件结构
3.1文件准备
先准备简单的代码,生成class文件,使用16进制编辑器查看(我使用的winhex查看)
package com.ruoyi.weixin.user; public class Hello { private static final int a = 10; private static int b; private int c; public int inc(){
return c - 1;
}
}
3.2magic魔数
3.2版本号
3.3常量池
3.3.1常量池容器计数器
查看偏移地址0x00000008-0x00000009,得到该常量池中一共有25(=26-1)个常量。减1的原因是常量是从1开始计数的。在Class文件格式规范制定之时,设计者将第0项常量空出来是有特殊考虑的,这样做的目的在于,如果后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义,可以把索引值设置为0来表示。Class文件结构中只有常量池的容量计数是从1开始。
3.3.2常量池常量
3.3.3常量表
3.3.4常量解析
下面就前面两个常量做一个解析
第一个常量0A 00 04 00 16(从0A判断常量类型,就可以知道这个常量的字节数)
OA是10,也就是说第一个常量的标志是10,查看结果总表,发现它是CONSTANT_Methodref_info,它包含三部分,共占5个字节
tag:OA,是10
index:00 04,是4,指向常量池中的第4个常量
index:00 16是第二个index,是22,指向常量池中第22个常量
第二个常量09 00 03 00 17
09是9,也就是标志是9,查看结果总表,发现它是CONSTANT_Fieldref_info,它包含三部分,共占5个字节
tag:09,是9
index:00 03,是3,指向常量池中的第4个常量
index:00 17是第二个index,是23,指向常量池中第23个常量
3.3.5使用javap来解析class文件
输入命令,输出字节码内容
javap -verbose Hello.class
可以看到共有25个常量,和常量计数器的数量一致,第一个是methodref,两个index指向第4和22个常量,第二个是fieldref,两个index指向第3和23个常量,和上面解析的是一样的
3.4访问标志
这里标志位是00 21,也就是0x0001和0x0020的和,表示被public修饰,且允许invokespecial字节码指令的新语义
3.5类索引、父类索引、接口索引集合
如上图所示:
类索引是00 03,指向常量池中第三个常量
父类索引是00 04,指向第四个常量
接口索引集合 00 00 ,没有实现接口
3.6字段表集合
后面紧跟着的就是字段学习。首先就是字段数量描述(字段表集合的大小),然后是字段表集合。
3.6.1简介
3.6.3字段表中的access_flags
3.6.4name_index
3.6.5descriptor_index
3.6.6attribute_count
字段数量:00 03 表示有三个字段,之后正式进入字段表集合
access_flags:00 1A表示 0x0002和0x0008和0x0010的和 表示private static final
name_index:00 05 指向第五个常量,字段名为a
descriptor_index:00 06指向第6个常量,值为 I,对于的 基本类型为int
再后面的属性表集合先不看,后面再讲
3.7方法表集合
3.7.1access_flags标志位
3.7.2 解析
access_flag:00 01 表示public
name_index:00 12 指向第18个常量,描述方法名
describle_index:00 13 指向第19个常量,描述方法学习,无参数,返回值int
属性表个数:00 01 1个属性表
属性表:后面讲
最新文章
- java中常见的几种异常
- 【转载】Selenim入门环境的搭建--Java环境下的Java Maven Project
- Android中加载位图的方法
- XE6移动开发环境搭建之IOS篇(6):设置Mac OSX的网络。(有图有真相)
- bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)
- 【leetcode】Combination Sum II (middle) ☆
- 【译】在Asp.Net中操作PDF – iTextSharp-列表
- mongodb3 ubuntu离线安装(非apt-get)及用户管理
- springboot入门的一点基础
- hdu 5476 (计算几何)
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集-补充-之安装iptables】
- 于用cocoapods添加第三方库,并且cocoapods添加成功,但是却在任何一个文件上都导入不了头文件
- flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用?
- 【由浅入深理解java集合】(五)——集合 Map
- Git配置信息相关命令
- nginx下后端节点realserverweb健康检测模块ngx_http_upstream_check_module
- Android使用帧动画内存溢出解决方法
- mysql 的sleep线程过多处理方法
- SQLServer字符串的一些截取技巧
- Python-线程的生命周期