JVM探索之路之Class文件结构解析(一):Class文件的格式与定义
JVM 学习笔记目录:
JVM探索之路之Class文件结构解析(二) :常量池
JVM探索之路之Class文件结构解析(三):访问修饰符、类索引、父类索引与接口索引集合
Class文件的格式与定义
Class文件是一组以8位字节(1Byte=8bit,计算机也有1Byte=16bit或1Byte=32bit的)为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符。当遇到需要占用8位字节以上空间的数据项时,则会按高位在前的方式分割成若干个8位字节进行存储。
Class文件结构中只有2种数据类型:无符号数和表。无符号数, 属于基本的数据类型,以u1、u2、u4、u8来分别表示1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值和UTF-8编码构成的字符串;表,是由多个无符号数或其他表作为数据项构成的复合数据类型,所有的表都习惯已"_info"结尾(整个Class文件可以看成是一张表)。
上图是Class文件的结构表,无论是无符号数还是表类型,当需要描述同一类型但数量不定的多个数据时。经常会使用一个前置的容量计数器加上若干个连续的数据项形式。例如:contant_pool_count、interfaces_count、fields_count、methods_count等都是前置容量计数器。
为了方便解释这些数据类型,提供一个非常简单的类作为例子来讲解:
package com.beliefbetrayal.clazz; public class ClassFileTest { private int m; public int getM() {return m; } public void setM(int m) {this.m = m; }}
这个例子非常非常简单,定义一个类,它有一个成员变量和对应的get和set方法。现在我们找到该类对应的Class文件,使用WinHex(将二进制文件以16进制的形式打开,1Byte=8bit,所以2个16进制数表示一个字节)将Class文件打开。将会显示如下信息:
图为Class文件的部分信息
Class文件结构的第一个数据项目"magic",它的类型为u4(4个字节),所以0xCAFEBABE为它的值,该数据项称为"魔数",它的作用是用于确定这个文件是否为一个能被虚拟机接收的Class文件。而虚拟机使用魔数而不是用扩展名的机制来判断Class文件是出于安全的考虑,因为扩展名是可以随意修改的。你可以查看所有符合要求的Class文件它的魔数都是"0xCAFEBABE"。
Class文件结构第二个和第三个数据项目为:"minor_version"和"major_version" 分别表示Class文件的次要版本和主要版本信息。它们的类型都为u2(2个字节)所以0x0000表示次要版本,0x0032表示主要版本。Class文件的版本号是从45开始的,JDK1.1之后每一个JDK大版本发布主版本号就向上加1。JDK1.1能支持的版本号为45.0~45.65535的Class文件,JDK1.2能支持的版本号为46.0~46.65535以此类推,现在最新的JDK1.7能支持51.0~51.65535版本号的Class文件。还需要注意的一点是:高版本的JDK可以向下兼容以前版本的Class文件,但不能运行以后版本的Class文件。0x0032换算成十进制为50,按照上面的推导,该Class文件是可以被JDK1.6或以上的版本的虚拟机执行的Class文件(也可以反映出该Class文件是由JDK1.6版本的编译器编译的)。
下次分析:Class文件中的常量池(contant_pool)
转载于:https://www.cnblogs.com/beliefbetrayal/archive/2012/02/01/2334100.html
JVM探索之路之Class文件结构解析(一):Class文件的格式与定义相关推荐
- jvm(6)-java类文件结构(字节码文件)
[0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构 的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编 ...
- JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)
JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...
- java解析nes_【JVM系列】一步步解析java执行内幕
对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...
- java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...
类文件结构 在说完了JVM内部结构后,接下来我们需要说一下另外一个非常重要的基础概念Class类结构. 我们既然知道了开发的Java源代码会首先被编译成字节码文件保存,JVM的类加载器会读取这些文件内 ...
- java 反编译class文件_用Java实现JVM第三章《解析class文件》
解析class文件 案例介绍 本案例主要介绍通过java代码从class文件中解析:class文件.常量池.属性表: 作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类.为了使jav ...
- binwalk 提取bootimg_boot.img格式文件结构解析
本帖最后由 ironMan.K 于 2018-3-22 13:50 编辑 以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header ...
- 【JVM系列】一步步解析java执行内幕,java初级面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索hairyang001加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各 ...
- ExtJs 4.1.1 文件结构解析
ExtJs 4.1.1 文件结构解析 如图: 转载于:https://www.cnblogs.com/blessed-1314/p/3523296.html
- 深入boot.img格式文件结构解析
以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...
最新文章
- mybatis dao实现 || 接口代理方式实现
- Flink 与 Hive 的磨合期
- (13)数据结构-先序中序还原二叉树
- [CTF]RAR加密原理
- 如何用定积分求椭圆的周长_怎么用微积分求椭圆的周长?
- 关于企业数字化转型的建议
- matlab神经网络工具箱使用教程
- 【C++ Primer Plus】第6章 分支语句和逻辑运算符
- 查看文章影响因子的插件_查询文献可实时显示影响因子与分区排名的2个强大浏览器插件...
- 自学系列外星人入侵2
- 浅谈Md5+Salt加密
- filezilla删除服务器文件,FileZilla的设置FTP服务器
- 期刊投稿状态_SCI 稿件在线投稿时遇到的几中状态
- 设计模式总是学不会?是时候换个姿势了
- 【翻译】十分钟助您明晰方向、激发创造
- 【一次认识一个市场技术指标】之RSI(相对强弱指标)
- 何钦铭c语言程序设计第八章,C语言程序设计(第3版)何钦铭颜晖第8章指针
- VS2017报错:E1696 命令行错误: 无法打开 元数据 文件 “platform.winmd”
- FLASH实用代码大全
- 【ibatis】ibatis 中 $与#的区别
热门文章
- 图片的 css sprite的应用思考
- authorization 传 就跨域_headers中添加允许token,客户端跨域请求问题
- SATA硬盘接口是什么
- 基金投资需要注意什么?
- 哪一瞬间让你下定决心减肥,并且坚定不移的执行,最终瘦身成功?
- 电子密封胶正常固化与非正常固化差别是什么?
- 程门立雪的故事,成语程门立雪的主人公是谁?
- At present, Huawei has two more important
- “S“ is the acronym for Super
- First of all, let’s talk about the richest man in Japan