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虚拟机11-Class文件结构的更多相关文章
- 深入理解Java虚拟机(类文件结构)
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...
- 《深入理解Java虚拟机》类文件结构
上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...
- 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...
- Java虚拟机 - Class类文件结构
[深入Java虚拟机]之二:Class类文件结构 平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Jav ...
- Java虚拟机,类文件结构深度解析
Java类文件结构 Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及 ...
- Java虚拟机11:运行期优化
前言 http://www.cnblogs.com/xrq730/p/4839245.html,HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再 ...
- Java虚拟机——Class类文件结构
Class文件格式采用一种类似C语言结构体的结构来存储数据,这种数据结构只有两种数据类型:无符号数和表. 无符号数属于基本的数据类型,数据项的不同长度分别用u1, u2, u4, u8表示, ...
- 深入理解Java虚拟机(七)——类文件结构
Java的无关性 由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码 ...
- 【Java虚拟机11】线程上下文类加载器
前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...
- Java虚拟机11:内存分配原则
前言 JVM的自动内存管理要自动化的解决两个问题:对象分配内存以及回收分配给对象的内存.对象的内存分配一般是指在堆上分配,少数情况下也可能会直接分配在老年代上,对象主要分配在新生代的Eden 区上,如 ...
随机推荐
- [CS61A] Lecture 1&2&3. Introduction&Functions&Control
[CS61A] Lecture 1&2&3. Introduction&Functions&Control 前言 CS61A是加州大学伯克利分校一门计算机专业课程,用于 ...
- 基于iNeuOS工业互联网平台的板材实时质检系统
1. 项目背景 刨花板生产线由于原料.生产工艺等原因,会有一些产品板面出现颤纹.漏砂.胶斑.胶块.大刨花.粉尘斑.板面划痕和油污等缺陷.表面缺陷会降低板材强度.影响板材外观和二次加工,给企业带来经济 ...
- 基于python的数学建模---传染病六个模型
六个模型的区别 SI-Model import scipy.integrate as spi import numpy as np import matplotlib.pyplot as plt # ...
- 关于cannot remove ‘directory': Directory not empty的解决办法
解决方法 首先你应该使用 rm -rf 目录名 这样确保可以递归删除目录 如果出现 cannot remove 'directory': Directory not empty 报错信息,重启电脑解决 ...
- freemarker if 回填CheckBox思路
开发场景中遇到这样的一个问题,在网上也找了一些结局方法,但不成功,于是自己写了一个笨一点的方法,算是一种方法,希望对遇到该开发场景的朋友有所帮助. freemarker html代码: <tab ...
- day31 1 tomcat介绍与创建web项目 & 2 继承HttpServlet类、配置webxml全局配置文件 & 3 servlet生命周期 & 4 请求对象HttpServletRequest与响应对象HttpServletResponse
Servlet Java Servlet是运行在Web服务器或应用服务器上的程序,作为客户端(Web浏览器或其他HTTP客户端)和服务端(HTTP服务器上的数据库或应用程序)之间的中间层. 使用Ser ...
- 【大数据-课程】高途-天翼云侯圣文-Day1:互联网大数据揭秘(大数据介绍&MR实现双十一举牌)
一.大厂职级 P7:年薪百万 二.大数据发展 1.职业路线和岗位角色 2.大数据行业发展 三.大数据的位置 1.热门行业 大数据承上启下 2.三者关系 啤酒和尿不湿:启发可以放在一块 3.大数据作用 ...
- 【Java EE】Day09 JavaScript基础、ECMAScript语法、Java对象
一.简介 1.概念 客户端脚本语言 脚本语言:无需编译,直接被解析执行 运行在:客户端浏览器,每个浏览器都有解析引擎 功能: 用户与页面交互 控制html元素 使页面产生动态效果 2.发展史 1992 ...
- 【Spark】Day04-Spark Streaming:与离线批量比较、架构特点、入门案例、创建(队列、数据源)、转换(有状态、无状态)、输出方式、进阶(累加、转换为DF、缓存持久化)、实战(窗口统计)
一.概述 1.离线和实时计算 离线:数据量大,数据不会变化,MapReduce 实时:数据量小,计算过程要短 2.批量和流式处理 批量:冷数据,数据量大,速度慢 流:在线.实时产生的数据(快速持续到达 ...
- 1分钟理清楚C++类模板和模板类区别
1.定义区别 类模板和模板类主要关注点是后一个单词. 类模板:主要描述的是模板,这个模板是类的模板.可以理解为一个通用的类,这个类中的数据成员,成员函数的形参类型以及成员函数的返回值类型不用具体的指定 ...