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 区上,如 ...
随机推荐
- K8S节点选择器案例
#给节点打上标签 [root@lecode-k8s-master deployment]# kubectl label no lecode-dev-001 hostname=lecode-dev-00 ...
- 【Java并发004】原理层面:synchronized关键字全解析
一.前言 synchronized关键字在需要原子性.可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是"万能"的.的确,大部分并发控制操作都能使用synchron ...
- 2.6:Python数据存取-文件、文件夹及目录、数据库
一.Python文件读写 1.文件的打开模式 <class '_io.TextIOWrapper'>和<class '_io.BufferedReader'>.python使用 ...
- JavaEE Day06 JDBC连接池&JDBCTemplate
今日内容: 数据库连接池 简化操作--Spring JDBC提供的 JDBC Template(JDBC的封装) 一.数据库连接池 1.引入 之前:每一次都要获取连接.释放连接-- 现在:连接重复使用 ...
- 【云原生 • DevOps】一文掌握容器管理工具 Rancher
一.容器管理工具 Rancher 介绍Rancher 是一个开源的企业级全栈化容器部署及管理平台,其实就是一个 Docker 的图形化管理界面.它为容器提供基础架构服务,可以让 CNI 兼容的网络服务 ...
- Redis Zset实现统计模块
1. 背景 公司有一个配置中心系统,使用MySQL存储了大量的配置,但现在不清楚哪些配置正在线上使用,哪些已经废弃了,所以需要实现一个统计模块,实现以下两个功能: 查看总体配置的数量以及活跃的数量 查 ...
- 搭建漏洞环境及实战——在Windows系统中安装WAMP
安装成功之后,打开显示 链接:https://pan.baidu.com/s/1NpU7fUYOO_CSM8dNXKdnCw 提取码:mxvw
- python运算符与基本数据类型
Python种类 JavaPython cPython ***** pypy 字节码 和 机器码 Python程序: 1. 终端: C:\python35\python.exe D:\1.py 解释器 ...
- 实用!7个强大的Python机器学习库!⛵
作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...
- 前端工程化筑基-Node/npm/babel/polyfill/webpack
00.前端搬砖框架 开发 ⇨ 构建 ⇨ 部署上线 ⇨ 摸鱼: 01.Node.js/npm Node.JS 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,不是JS库(是C ...