Class文件结构

class 文件结构 info。 阅读详情

1、概述

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据。

根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表。

无符号数:属于基本数据类型,以u1、u2、u4、u8来分别代表1、2、4、8个字节的无符号数。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码的字符串值。

表:是由多个无符号数或其他表作为数据项构成的符合数据类型,所有的表都习惯性地以“_info”结尾。

整个Class文件本质就是一张表。


接下来后来看看Class文件中按照严格的顺序排列的字节流都具体包含些什么数据:


有一点我们需要注意,比如cp_info,cp_info表示常量池,上图中用constant_pool[constant_pool_count-1]的方式来表示常量池有constant_pool_count-1个常量,它这里是采用数组的表现形式,但是大家不要误以为所有的常量池的常量长度都是一样的,其实这个地方只是为了方便描述采用了数组的方式,但是这里并不像编程语言那里,一个int型的数组,每个int长度都一样。明确了这一点以后,我们在回过头来看看上图中每一项都具体代表了什么含义。


下面首先给出一段简单的Java程序,以这段代码编译成的Class文件为基础进行Class文件结构的介绍,代码如下:

  1. public class TestClass{    
  2.     private int num;    
  3.         
  4.     public int inc(){    
  5.         for(int i=0; i<10; i++){    
  6.             num = i;    
  7.         }    
  8.         return num;    
  9.     }    
  10.         
  11.     public static void main(String[] args){    
  12.         new TestClass().inc();    
  13.     }    
  14.         
  15. }   
把代码编译成Class文件后,使用16进制编辑器WinHex打开这个Class文件,可以看到Class的内部结构如下:



2、魔数与Class文件的版本

Class文件格式表中,第一项为一个u4类型的名为magic的数据项。这是因为每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用就是用来确定这个文件是否为一个能被虚拟机接受的Class文件。很多文件存储标准中都使用魔数来进行身份识别。例如图片格式。使用魔数而不是扩展名来进行识别主要是基于安全考虑,因为文件扩展名可以很随便地被人为改动。Class文件的魔数的值为:0xCAFFBABE。class文件魔数值如下图所示:
 

紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6字节是次版本号(Minor Version),第7个和第8个字节是主版本号(Major Version)。

上图代表版本号的第5个字节和第6个字节值为0x0000,而主版本号的值为0x0032,即十进制的50


3、常量池
紧接着主次版本号之后的是常量池入口,常量池是Class文件结构中与其他项目关联最多的数据类型。常量池之中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic Reference)。字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括了下面三类常量:
   1.类和接口的全限定名(Fully Qualified Name)
   2.字段的名称和描述符(Descriptor)
   3.方法的名称和描述符。
 
使用Javap命令输出常量表:

  1. <span style="font-size:14px;">D:\JVM>javap -verbose TestClass    
  2. Compiled from "TestClass.java"    
  3. public class TestClass extends java.lang.Object    
  4.   SourceFile: "TestClass.java"    
  5.   minor version: 0    
  6.   major version: 50    
  7.   Constant pool:    
  8. const #1 = Method       #6.#20; //  java/lang/Object."<init>":()V    
  9. const #2 = Field        #3.#21; //  TestClass.num:I    
  10. const #3 = class        #22;    //  TestClass    
  11. const #4 = Method       #3.#20; //  TestClass."<init>":()V    
  12. const #5 = Method       #3.#23; //  TestClass.inc:()I    
  13. const #6 = class        #24;    //  java/lang/Object    
  14. const #7 = Asciz        num;    
  15. const #8 = Asciz        I;    
  16. const #9 = Asciz        <init>;    
  17. const #10 = Asciz       ()V;    
  18. const #11 = Asciz       Code;    
  19. const #12 = Asciz       LineNumberTable;    
  20. const #13 = Asciz       inc;    
  21. const #14 = Asciz       ()I;    
  22. const #15 = Asciz       StackMapTable;    
  23. const #16 = Asciz       main;    
  24. const #17 = Asciz       ([Ljava/lang/String;)V;    
  25. const #18 = Asciz       SourceFile;    
  26. const #19 = Asciz       TestClass.java;    
  27. const #20 = NameAndType #9:#10;//  "<init>":()V    
  28. const #21 = NameAndType #7:#8;//  num:I    
  29. const #22 = Asciz       TestClass;    
  30. const #23 = NameAndType #13:#14;//  inc:()I    
  31. const #24 = Asciz       java/lang/Object;    
  32.     
  33. {    
  34. public TestClass();    
  35.   Code:    
  36.    Stack=1, Locals=1, Args_size=1    
  37.    0:   aload_0    
  38.    1:   invokespecial   #1; //Method java/lang/Object."<init>":()V    
  39.    4:   return    
  40.   LineNumberTable:    
  41.    line 1: 0    
  42.     
  43.     
  44. public int inc();    
  45.   Code:    
  46.    Stack=2, Locals=2, Args_size=1    
  47.    0:   iconst_0    
  48.    1:   istore_1    
  49.    2:   iload_1    
  50.    3:   bipush  10    
  51.    5:   if_icmpge       19    
  52.    8:   aload_0    
  53.    9:   iload_1    
  54.    10:  putfield        #2; //Field num:I    
  55.    13:  iinc    1, 1    
  56.    16:  goto    2    
  57.    19:  aload_0    
  58.    20:  getfield        #2; //Field num:I    
  59.    23:  ireturn    
  60.   LineNumberTable:    
  61.    line 5: 0    
  62.    line 6: 8    
  63.    line 5: 13    
  64.    line 8: 19    
  65.     
  66.   StackMapTable: number_of_entries = 2    
  67.    frame_type = 252 /* append */    
  68.      offset_delta = 2    
  69.      locals = [ int ]    
  70.    frame_type = 250 /* chop */    
  71.      offset_delta = 16    
  72.     
  73.     
  74. public static void main(java.lang.String[]);    
  75.   Code:    
  76.    Stack=2, Locals=1, Args_size=1    
  77.    0:   new     #3; //class TestClass    
  78.    3:   dup    
  79.    4:   invokespecial   #4; //Method "<init>":()V    
  80.    7:   invokevirtual   #5; //Method inc:()I    
  81.    10:  pop    
  82.    11:  return    
  83.   LineNumberTable:    
  84.    line 12: 0    
  85.    line 13: 11    
  86.     
  87.     
  88. }  </span>  


4 访问标志
   在常量池结束之后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是接口还是类;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否声明为final,等等。
 
5 类索引、父类索引与接口索引集合
   类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。Java不允许多重继承,所以父类索引只有一个,除了java.lang.Object外,所有Java类的父类索引都不为0。接口索引集合就用来描述这个类实现了哪些接口,所有被实现的接口按类定义中的implements(如果类是一个接口则是extends)后的接口顺序从左到右排列在接口的索引集合中。
 
6 字段表集合
   字段表(field_info)用于描述接口或类中声明的变量。字段(field)包括了类级变量和实例级变量,但不包括方法内部声明的变量。一个字段的信息包括:作用域(public、private、protected修饰符)、是实例变量还是类变量(static修饰符)、可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)、可否序列化(transient修饰符)、字段数据类型(基本数据类型、对象、数组)、字段名称。这些信息中,各个修饰符都是布尔值,要么有,要么没有。
   全限定名称:如果TestClass类是定义在com.chenzhou.jvm包中,那么这个类的全限定名为com/chenzhou/jvm/TestClass。
   简单名称:简单名称指没有类型和参数修饰的方法或字段名称,在上面的例子中,TestClass类中的inc()方法和num字段的简单名称分别为“inc”和“num”。
   描述符:描述符的作用是用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。根据描述符规则,基本数据类型(byte,char,double,float,int,long,short,boolean)及代表无返回值的void类型都用一个大写字符来表示,而对象则用字符L加对象的全限定名来表示,如下图所示:


7 方法表集合
    Class文件存储格式中对方法的描述与对字段的描述几乎完全一致。方法表的结构如同字段表一样,一次包括了访问标志、名称索引、描述符索引、属性表集合几项。
 

8 属性表集合
    Java虚拟机规范第二版中预定义了9项虚拟机应当能识别的属性,包括:Code、ConstantValue、Deprecated、Exceptions、InnerClasses、LineNumberTable、LocalVariableTable、SourceFile、Synthetic。


转载至:Class文件结构--爱上在路上


IAR使用教程:如何导入现有工程并成功编译 详细介绍如何在IAR中导入现有工程项目并完成编译配置,解决常见报错问题。通过清晰的操作指引,帮助开发者快速上手iar使用教程中的关键环节,提升开发效率。 阅读详情

相关推荐

君正T31x metartc集成测试

metartc为国内杨大侠部分开源的一款用于嵌入式领域webrtc库,它与谷歌官方webrtc相比,编译到君正平台的可执行文件仅有5M即可实现webrtc的通信。1. 目前实现的是基于开源版v5.0-b0版本做的简单修改,官方的好几个版本都多少缺点东西,我这里给整理了一下。目前是局域网连接的webrtc,后续尝试走stun和turn试一下NAT穿越的效果。

fsmpeg的博客 3157

Class类文件的结构

Class文件是一组以8个字节(64位)为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8个字节进行存储。Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:“无符号数”和“表”。后面的解析都要以这两种数据类型为基 础,所以这里笔者必须先解释清楚这两个概念。

m0_49710410的博客 2269

通过薄膜太阳能电池中的热激电流量化陷阱状态

发光(led)和光伏(PV)器件的性能取决于光活性半导体材料的质量。由于材料杂质或在制造过程中在半导体材料中无意地引入缺陷,导致偏离最佳性能。这些缺陷被称为阱态,或简称“阱”,它是半导体带隙内的高能态。一般来说,陷阱的发生可能是由于材料杂质(在散装)或在不同材料层之间的界面。在有机半导体中,由于天然物质的无序性,阱态经常出现。在无机和杂化半导体(例如:杂化钙钛矿、硅……)中,晶界的存在是圈闭态的已知来源。由于陷阱产生的原因多种多样,它们对装置的影响也是多种多样的。由于载流子的多次捕获和释放事件,特别是浅阱的

FluximAG的博客 2849

类(class)文件结构

1、类文件介绍 每一个 Class 文件都对应着唯一一个类或接口的定义信息,但是相对地,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。 本节中,我们只是通俗地将任意一个有效的类或接口所应当满足的格式称为“Class 文件格式”,即使它不一定以磁盘文件的形式存在。 每个 Class 文件都是由 8 字节为单位的字节流组成,所有的 16 位、32 位和 64 位长度...

Android小码农的博客 1474

Unity 热更新技术 |(六)xLua框架学习最新系列完整教程

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来先从XLua学习使用 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

RT-DETR改进策略【损失函数篇】| 通过辅助边界框计算IoU提升检测效果(Inner_GIoU、Inner_DIoU、Inner_CIoU、Inner_EIoU、Inner_SIoU)

为了弥补现有 IoU 损失在不同检测任务中泛化性弱和收敛速度慢的问题,·Inner-IoU·通过引入比例因子 “ratio” 来控制辅助边界框的尺度大小,利用不同尺度的辅助边界框来计算损失,从而加速边界框回归过程。

Limiiiing的博客 1964

Java的 Class字节码文件结构和内容全面解析【两万字】

详细介绍了Java的 Class(类)文件结构,一步步详细分析Class文件源码,并且都有案例演示。

终生学习践行者 8955

已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!!

已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!!

wbajsjhhhhh的博客 1万+

JVM虚拟机——Class文件结构

魔数Class文件版本常量池访问标志类索引,父亲索引,接口索引集合字段表集合方法表集合属性表集合。

2401_85441188的博客 1804

pymol 动画简单制作,gif、mp4导出

参考: https://www.youtube.com/watch?v=G77K9Lro8js1、直接Movie下Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec;如果要动画过渡自然,可以在这4sec后面再Append 1sec;如果需要两个视角,既可以再把窗口蛋白定位到比如配体,不用管中间过程怎么定位过去配体,再Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec添加;最后如果要整体形成个循环播放,可以在这4s

weixin_42357472的博客 8435

SAP Joule Studio 能不能用来开发 skill:可以,但它开发的是 Joule 语境下的企业级 skill,而不是替代所有 SAP 开发技术的万能锤

SAP Joule Studio 专为开发Joule技能(Joule skills)而设计,这些技能是执行确定性单步业务动作的原子能力。它通过自然语言接口连接SAP和非SAP系统,适合处理边界清晰、可审计的任务(如创建工单、查询发票)。Joule技能作为会话式业务编排层,与ABAP、CAP等核心技术互补而非替代。开发支持低代码和专业代码两种方式,并具备企业级治理能力,但需要相应的BTP订阅和技术基础。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 199

Java Class文件结构细节最全解读

Class文件的结构并不是一成不变的,随着Java虚拟机的不断发展,总是不可避免地会对Class文件结构做出一些调整,但是其基本结构和框架是非常稳定的。魔数Class文件版本常量池访问标识(或标志)类索引,父类索引,接口索引集合字段表集合方法表集合属性表集合这是一张Java字节码总的结构表,我们按照上面的顺序逐一进行解读就可以了。

Java全能学习+面试指南 455

RK3568下MIPI屏幕调试技巧

通过合理配置设备树节点、精确计算像素时钟并完成编译烧录,可高效实现RK3568平台MIPI屏幕的点亮与显示调试。关键在于严格遵循屏幕规格书参数,结合内核日志定位问题,逐步优化时序配置。掌握这一流程后,开发者可快速适配不同分辨率、刷新率的MIPI屏幕,为嵌入式系统显示模块开发奠定基础。如果在调试中遇到特定问题(如驱动匹配失败、时钟计算误差),建议优先查阅屏幕规格书和RK3568芯片手册,或通过内核社区(如Linux-DRI邮件列表)获取支持。

文石_2009的博客 1204

Java中的class文件结构

Java中的.class文件结构是Java源代码经过编译后生成的二进制文件结构,它包含了Java类的结构和信息。以下是对Java中.class文件结构的详细解析综上所述,Java中的.class文件结构是一个复杂但有序的二进制流,它包含了Java类的结构和信息。通过对.class文件结构的解析,我们可以了解Java类的内部结构、字段、方法以及它们之间的关系等信息。

sutingStart的博客 1063

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

014-JVM-Class文件结构概况

我们写了一个HelloWorld.java,然后通过javac编译出一个HelloWorld.class文件,那么这些类似的class文件中都存有那些东西呢? 下面给出答案: 1. Class文件结构概况 下图有点模糊,可以直接访问查看源脑图: https://www.processon.com/view/link/5fdef0e763768907e4a967f7 2. 总结 这个脑图是对class中含有文件的整体概况,一定要先过一遍,要有感性认识,然后在看二进制或者16进制的class文件源文件的时候绘

前路无畏的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

class文件结构详细解析

之前一直好奇java文件经过编译后生成的class文件,到底存储了什么信息?是如何被jvm识别并执行的?我们可不可以通过外部力量修改class文件内容,以致可以修改程序的运行?于是我带着种种疑问,开始研究class文件。参考《深入理解Java虚拟机》(周志鹏著) 在深入分析class文件之前,我们先来探讨class文件存在原因: 无关性的基石:Java刚开始诞生时的宣传口号“一次编写,到处运行”,开发者早就料想到,各种不用的硬件体系结构、各种不同的操作系统将来肯定会长期并存发展,实现跨平台的基础就是实现在操

weixin_43483947的博客 2737

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深入class文件结构

深入class文件结构

荣兄2016的博客 347

为什么.class文件查看不了_Class文件结构

Class文件结构Java技术能够一直保持非常好的向后兼容性,这点Class文件结构的稳定性功不可没。Java目前已经发展到JDK14,但是class文件结构的内容,绝大部分在JDK1.2时代就已经定义好了。虽然JDK1.2的内容比较古老,但是java发展经历了十余个大版本,但是每次基本上只是在原有结构基础上新增内容、扩充功能,并未对定义的内容做修改。Class文件是一组以8位字节为基础...

weixin_39664456的博客 302

JVM进阶之路(十一)Class文件结构

Java虚拟机和Class文件是Java实现系统无关性的基石。Class文件是JVM实现语言无关性的基石。Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。每一个 Class 文件对应于一个如下所示的 ClassFile 结构体:复制代码简单看一下各项的含义:由于 Class 文件结构没有任何分隔符,所以无论是每个数据项的的顺序还是数量,都是严格限定的,哪个字节代表什么含义,长度多少,先后顺序如何,都是不允许改变的。接下来我们来具体学习每项的含义。

mifffy_java的博客 1041

JVM入门到放弃之Class文件结构

一、Class文件结构 1.1Java Class文件 首先你要明白一件事,电脑是以01001101001110方式执行程序的 问:是不是只有java编译器才能把 . Java 文件编译成 . class 文件? 答:不是,jython/Scala/Groovy/Jruby都可以 1.2 Java Class文件组成内容 1.2 Java Class文件格式 u1 一个字节 u2 两...

weixin_39827145的博客 169

JVM Class文件结构

学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次编写,到处运行”,其实说到无关性,Java平台还有另外一个无关 性那就是语言无关性,要实现语言无关性,那么Java体系中的class的文件结构或者说是字节码就显得相当重要了,其实Java从刚开始的时候就有两套 规范,一个是Java语言规范,另外一个是Java虚拟机规范,Java语言规范只是规定了Java语言相关的约束...

忍者算法的博客 321
上一篇: java虚拟机类加载机制
下一篇: Java Web 防范 SQL 注入攻击
SupWTian
博客等级 码龄15年 8粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值