什么是class文件

当我们写个开发一个java程序后,通过通过javac(编译工具)将其编译成.class格式的字节码文件,在交给JVM通过字节码解释器或JIT即时编辑器混合执行,class文件其实就是一个二进制字节流文件,他有固定的格式。下面我们来详细介绍一个class文件的格式与组成。

编写一个简单的java类文件


这里我们写一个简单的java类,没有加构造方法。

生成class文件

通过javac工具生成class文件,通过相关反编译工具我们可以看到class文件会自动增加一个无参构造方法。

查看16进制的class文件

利用sublinetext文本工具或者idea的插件bined 可以查看class字节码文件,如下图所示:

class文件组成

下图为class文件的组成部分。注:U代表无符号数,2代表占位两个字节。info为一个数据集合

下图为对上图每个构成部分的解释。

通过以上的组成我们来分析一下我们生成的class文件。
1.magic number
文件头4个字节定义的一个class文件的标准格式符,非该格式的文件将不被jvm识别为class文件。的cafebabe(可以理解为咖啡宝贝)也可能是java之父的低级乐趣。

2.minor_version
占位两个字节,代表的是编译class文件的jdk的次要版本号,我们可以看到该class文件的小版本号为0


3.major_version
占位两个字节,代表的是编译class文件的jdk的主要版本号,我们可以看到该class文件的大版本号16进制是34(十进制是52)
由于我的本地环境是1.8版本,所以我们得知1.8版本在class文件标识的是52,

次要本号和主要版本号共同协定了class文件格式的版本,组合在一起(majornminor) ,所以我们编译生成的class文件的jdk版本为52.0
对于主要版本和次要版本,java虚拟机说明文档中有详细的介绍。
主要版本不同的jdk版本的版本号不同,同时jvm虚拟机高版本支持低版本jdk编译的class文件解析和执行。低版本不支持高版本jdk编译的class文件解析和执行。具体各个版本的在class文件中的主要版本号如下图所示:

次要版本取值范围对于jdk版本有写区别,jdk1.0.1(主要版本45)范围为[0-3],在jdk1.2(主要版本45)范围为[0-65535],在jdk1.2以后的版本(46-55)唯一支持的次要版本是0,jdk12以后支持的次要版本只能是0和65535。

4.constant_pool_count
占位2个字节,标识该class文件常量池中的数量,该class文件的常量池中的常量数量为16个,但实际上常量池中的索引是从[1-(constant_pool_count-1)]。

5.constant_pool
常量池集合,该内容是整个class文件的重中之重。各个字符串常量、类名、接口名称、字段名称、方法名称,以及classFile结构以及字结构中引用的其他常量都在这个集合中标识。常量池中每个条目的结构如下:

集合中每个条目的格式有第一个字节来标识(目前理解为标签)。每个标识后面跟着两个或者更多字节提供特定常量的信息,下图为常量池支持的常量格式类型。

我们已测试class文件为例。常量池中第一个条目的tag(标签)为0A(十进制为10),在上图中找tag为10的常量类型。

tag为10的是CONSTANT_Methodref_info,该常量信息指向常量池中索引标记分别为03和13的常量条目,我们来看一下第一个条目指向的第三个常量池索引中的内容

常量池中第一个条目指向的第三个条目中的标签为07,常量标签为07,对应的是类型为CONSTANT_Class_Info,对应指向的是索引下表为15的常量条目,我们以此类推找到第15个条目,看一下第15个条目的内容

条目15的标签类型为01,对应的类型为CONSTANT_Utf8_info,该条目类型比较特殊。内容有两部分,u2(无符号整数两个字节)代表该条目字节长度。后面为具体条目内容,我们可以看到第15个条目的长度为15个字节,将其转换成utf-8的字符串内容为 “java/lang/Object”。
每个常量类型的格式都不相同,为了更好的区分,我将jvm中最权威的介绍引入此,大家感兴趣可以查看jvm文档(jdk19),链接如下:
https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.4.1
6.access_flags
标识该class的访问修饰符,占位两个字节,该字段是按位标识的,每一位代表一个修饰标志(可以有多个修饰标志),对于该字段jvm也有明确的规则,如下图所示:

我们在看我们的class文件中access_flags标志位的内容,0021代表该类标志为ACC_PUBLIC,ACC_SUPER,说明该类是可以从保外访问的,并且在可以调用超类方法做处理。如下所示:
7.this_class
两个字节,标识的是该类的全限定名,该信息也标志在常量池中,此处标记的是常量池中的条目下标。此处不多赘述,大家可以参考上述查看常量池信息的步骤进行查阅。

8.super_class
两个字节,标识的是父类的全限定名,该信息也标志在常量池中,此处标记的是常量池中的条目下标。此处不多赘述,大家可以参考上述查看常量池信息的步骤进行查阅,有次我们可以看到为什么java对于父类来说是单继承的关系了。

9.interfaces_count
代表该类实现的接口的数量,两个字节。从该信息我们可以看出,一个类可以实现的接口最多为2^16-1个。
该class文件中实现的接口为0个。对于实现了接口的情况。我们抽时间会对次进行详细说明。

10.interfaces
class实现的接口的全限定名,该信息也标志在常量池中,u2*interfaces_count个字节。此处标识的是常量池中的条目下标。
11.fields_count
class的成员变量数量,两个字节,从该信息中我们可以看到,一个类最多可以有2^16-1个成员变量。
该class的成员变量为0个。对于成员变量的情况。我们抽时间会对次进行详细说明。

12.fields
class类中成员变量信息。结构如下:

13.methods_count
class类中方法的数量,两个字节标识,由此我们可以看到 一个类的方法最多也是2^16-1个。

14.methods_info
方法的详细信息,此信息的结构如下。

在method_info中的7个属性对于classJava虚拟机正确解释文件至关重要。

15.attributes_count
class中额外属性的数量,两个字节。
16.attributes_info 该机构可复用在fields_info methods_info 中的attibute_info信息中。
class中额外属性的信息,结构如下。

由于methods 和attributes 两处的结构较为复杂,此次现将整体结构展现给大家,后期再对此处做详细解析。

class文件格式解析相关推荐

  1. Android init.rc文件格式解析

    /****************************************************************************** Android init.rc文件格式解 ...

  2. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  3. gcc 删除elf_ELF文件格式解析器 原理 + 代码

    本文为看雪论坛精华文章 看雪论坛作者ID:菜鸟m号 附件链接:[原创] ELF文件格式解析器 原理 + 代码 写在前面: 读<Linux二进制>,发现作者对 ELF文件格式部分并没有做详细 ...

  4. cfile清空文件内容_编译-链接-加载 :ELF文件格式解析

    摘要:对于C++的初学者,经常在程序的编译或者加载过程中遇到很多错误,类似undefined reference to ... 和 GLIBCXX_3.4.20 not found 等.这些错误都涉及 ...

  5. mp4文件格式解析(一)

    原文地址:mp4文件格式解析(一)作者:可下人间 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPE ...

  6. QuickTime文件格式解析

    QuickTime文件格式解析 Peter Lee 2008-06-14 一.简介 QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建,生产,和分发,并为这一 ...

  7. elf section类型_ELF文件格式解析

    ELF文件格式解析 ELF(Executable and Linking Format) 1) 可重定位的对象文件(Relocatable file) 2) 可执行的对象文件(Executable f ...

  8. .lnk文件格式解析

    .lnk文件格式解析 由于.lnk文件提供丰富的调用方式,因此在研究该文件类型格式的基础的可以发现有很多字段可以被恶意利用.下面是一个.lnk文件格式的通用结构,也就 说.lnk文件是由这样不同的节组 ...

  9. fastq与fasta文件格式解析

    fastq与fasta文件格式解析 一.fasta格式 二.fastq格式 2.1 格式说明 2.2 碱基质量计算 2.3 Quality Score简化 三.二代测序的fastq文件格式介绍 四.补 ...

  10. android 播放视频文件格式,Android视频文件格式解析相关分析

    目录结构 OpenCore的代码在如下目录中:external/opencore/.这个目录是OpenCore的根目录,其中包含的子目录以下所示: * android:这里面是一个上层的库,它基于PV ...

最新文章

  1. 文巾解题 100. 相同的树
  2. lsync+rsync 实时同步(ubuntu16.04系统)
  3. 企业信息门户与办公自动化的集成应用
  4. 过度扩容 A股“虚胖”
  5. ip动态分配痕迹会保留多久_段王爷《新国潮七剑》为你解剖新国潮还能潮多久?...
  6. Drool实战系列(二)之eclipse安装drools插件
  7. sublime快捷键操作
  8. AdBlock Plus 大幅飙升 Firefox 内存开销
  9. maltab datenum函数与正则表达式巧用:逐日数据转为逐月数据、日序转月序
  10. linux系统宕机处理方式,如何处理Linux系统宕机的问题
  11. OSChina 周六乱弹 —— 召唤养我的富婆
  12. 红米停在android,红米手机在Android开发中无法获取data/data中数据的问题
  13. 自己做语料——Python爬取新闻联播文字版
  14. phpadmin删除数据库中的用户
  15. Elasticsearch应用案例1:百度
  16. [开源][130522]DIY简易红外遥控信号发射器
  17. 如何使用SQL进行模糊查询
  18. 【jzoj2220】【二分】愤怒的奶牛2(angry)
  19. 单页双曲面 matlab,如何画双叶双曲面
  20. Springboot @Lazy注解

热门文章

  1. SQL实战(2)——国庆期间每类视频点赞量和转发量
  2. 每个销售员都需要掌握的获取新客户的9种方法
  3. 2021 最新 Cloudera 大数据平台 CDP 升级指南白皮书完整版开放下载!(中文版)...
  4. x3dom:9.为物体添加纹理
  5. c语言 linux系统 delay,Linux下实现秒级定时任务的两种方案
  6. matlab中如何用数组绘图,matlab 基础学习(1)——数组,矩阵操作和绘图基础学习...
  7. 华为语音解锁设置_华为手机语音转文字怎么设置,如何完成音频在线转换
  8. Node.js 和npm的安装(插件的安装)
  9. Centos下openresty-1.19.9-1环境搭建
  10. 一文看懂ArrayList的自动扩容