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文件的格式与定义相关推荐

  1. jvm(6)-java类文件结构(字节码文件)

    [0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构  的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编 ...

  2. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  3. java解析nes_【JVM系列】一步步解析java执行内幕

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...

  4. java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...

    类文件结构 在说完了JVM内部结构后,接下来我们需要说一下另外一个非常重要的基础概念Class类结构. 我们既然知道了开发的Java源代码会首先被编译成字节码文件保存,JVM的类加载器会读取这些文件内 ...

  5. java 反编译class文件_用Java实现JVM第三章《解析class文件》

    解析class文件 案例介绍 本案例主要介绍通过java代码从class文件中解析:class文件.常量池.属性表: 作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类.为了使jav ...

  6. binwalk 提取bootimg_boot.img格式文件结构解析

    本帖最后由 ironMan.K 于 2018-3-22 13:50 编辑 以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header ...

  7. 【JVM系列】一步步解析java执行内幕,java初级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索hairyang001加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各 ...

  8. ExtJs 4.1.1 文件结构解析

    ExtJs 4.1.1 文件结构解析 如图: 转载于:https://www.cnblogs.com/blessed-1314/p/3523296.html

  9. 深入boot.img格式文件结构解析

    以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...

最新文章

  1. mybatis dao实现 || 接口代理方式实现
  2. Flink 与 Hive 的磨合期
  3. (13)数据结构-先序中序还原二叉树
  4. [CTF]RAR加密原理
  5. 如何用定积分求椭圆的周长_怎么用微积分求椭圆的周长?
  6. 关于企业数字化转型的建议
  7. matlab神经网络工具箱使用教程
  8. 【C++ Primer Plus】第6章 分支语句和逻辑运算符
  9. 查看文章影响因子的插件_查询文献可实时显示影响因子与分区排名的2个强大浏览器插件...
  10. 自学系列外星人入侵2
  11. 浅谈Md5+Salt加密
  12. filezilla删除服务器文件,FileZilla的设置FTP服务器
  13. 期刊投稿状态_SCI 稿件在线投稿时遇到的几中状态
  14. 设计模式总是学不会?是时候换个姿势了
  15. 【翻译】十分钟助您明晰方向、激发创造
  16. 【一次认识一个市场技术指标】之RSI(相对强弱指标)
  17. 何钦铭c语言程序设计第八章,C语言程序设计(第3版)何钦铭颜晖第8章指针
  18. VS2017报错:E1696 命令行错误: 无法打开 元数据 文件 “platform.winmd”
  19. FLASH实用代码大全
  20. 【ibatis】ibatis 中 $与#的区别

热门文章

  1. 图片的 css sprite的应用思考
  2. authorization 传 就跨域_headers中添加允许token,客户端跨域请求问题
  3. SATA硬盘接口是什么
  4. 基金投资需要注意什么?
  5. 哪一瞬间让你下定决心减肥,并且坚定不移的执行,最终瘦身成功?
  6. 电子密封胶正常固化与非正常固化差别是什么?
  7. 程门立雪的故事,成语程门立雪的主人公是谁?
  8. At present, Huawei has two more important
  9. “S“ is the acronym for Super
  10. First of all, let’s talk about the richest man in Japan