Class字节码文件结构总结

【0】README

0.1)本文总结于 Clas字节码文件,旨在理清 Class字节码文件的大体结构;

【1】干货开始

对上图的分析(Analysis):

A1)offset=0

  • A1.1)头四个字节为CAFEBABE:表示魔数;
  • A1.2)第5、6个字节是0x0:表示Class文件的次版本号;
  • A1.3)第7、8个字节是0x34:表示主版本号;
  • A1.4)第9、10个字节是0x13=19:表示常量池中常量个数,不过编号0不使用,故实际上只有18个常量;
  • A1.5)第11~15个字节是(0x0A 0x04 0x0F):分别表示常量池中常量标志(类型标志),查表6-3知,其类型是 CONSTANT_Methodred_info,且查表6-6知,后面是index=0x04(2个字节)和index=0x0F(2个字节),前者指向声明方法的类描述符 CONTSTANT_Class_info的索引项(#4),查表6-4知,CONTSTANT_Class_info=(tag,name_index);后者指向名称及类型描述符CONSTANT_NameAndType
    索引项(#15),继续查表;
  • A1.6)第16个字节=0x09,又是常量标志,查表6-3知,表示 CONSTANT_Fieldref_info(字段的符号引用),继续查表。。。这样的常量有18个,我们到了0xB0行;

A2)offset=0xB0,存储类索引+父类索引+接口索引

  • A2.1)第1、2个字节是0x03:表示类索引(#3);
  • A2.2)第3、4个字节是0x04:表示父类索引(#4);
  • A2.3)第5、6个字节是0x00:表示接口索引(#0,表示没有实现任何接口);

A3)offset=0xB6(查表6-8),存储字段信息

  • A3.1)第1、2个字节是0x01:表示字段个数;
  • A3.2)第3、4个字节是0x02:查表6-9知,字段访问标志是ACC_PRIVATE;
  • A3.3)第5、6个字节是0x05:表示name_index(字段名称索引)=#5,(m);
  • A3.4)第7、8个字节是0x06:表示desc_index(字段描述符索引)=#6(I==Int);(干货——所以到这里,我们就可以推断出源代码定义的字段为
    private int m);
  • A3.5)第9、10个字节是0x00,0x00:属性个数和属性表均为0;

A4)offset=0xC0,存储方法信息(查表6-11)

  • A4.1)第1、2个字节是0x02:表示方法数量;
  • A4.2)第3、4个字节是0x01:查表6-12知,方法访问标志为public;
  • A4.3)第5、6个字节是0x07:表示方法名称索引=#7=<init>(干货——实例构造器为<init>方法);
  • A4.4)第7、8个字节是0x08:表示方法描述符索引=#8=<>V;
  • A4.5)第9、10个字节是0x01:表示属性数量=1;
  • A4.6)第11、12个字节是0x09:表示属性信息索引=$9=Code;
  • A4.7)第13、14个字节是0x00:表示属性个数;
  • A4.7)第15、16个字节是0x0D:......;

A5)offset=0xD0,存储Code属性的信息,如下图所示:

A6)后面我偷个懒,还有一些属性的字节码表示:刚刚介绍了Code属性,接下来是
Exceptions属性,LineNumberTable属性,LocalVariableTable属性,SourceFile属性, ConstantValue属性, InnerClass属性, Deprecated和Synthetic属性,StackMapTable属性,Signature属性,和 BootstrapMethods 属性等, 它们的截图示例如下:

Conconsion)总结下Class字节码文件格式的大致结构(排名分先后)(非常重要):

  • 1)Class文件标识符——魔数(CAFEBABY);
  • 2)Class文件的次版本号+主版本号;
  • 3)常量池(常量个数,(常量类型标志 ,常量值索引)* )
  • 4)类索引+父类索引+接口索引;
  • 5)字段表集合:字段个数,访问标志,字段名称索引,字段类型描述符索引等;
  • 6)方法表集合:方法个数,访问标志,方法名称索引,方法类型描述符索引,属性表集合等;
  • 7)属性表集合:这里的属性并不是类中的属性,字节码文件结构中的属性在本文文末有图所示(我只举了部分属性荔枝,详见java类文件结构(字节码文件)中的表6-13):
    • 7.1)重要的属性集合有:Code属性,Exceptions属性,LineNumberTable属性,LocalVariableTable属性,SourceFile属性, ConstantValue属性, InnerClass属性, Deprecated和Synthetic属性,StackMapTable属性,Signature属性,和 BootstrapMethods 属性等;(它们的截图示例如A6所示)
时间: 2024-11-05 16:25:42

Class字节码文件结构总结的相关文章

深入理解JVM-java字节码文件结构剖析(1)

public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; } } javap -verbose MyTest1 警告: 二进制文件MyTest1包含jvm.bytecode.MyTest1 Classfile /Users/luozhiyun/Documents/work/jvm_lecture/target/classes/jvm

深入了解 Java 字节码

1.1 什么是字节码? Java 在刚刚诞生之时曾经提出过一个非常著名的口号: "一次编写,到处运行(write once,run anywhere)",这句话充分表达了软件开发人员对冲破平台界限的渴求."与平台无关"的理想最终实现在操作系统的运用层上: 虚拟机提供商开发了许多可以运行在不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的"一次编写到处运行". 各种不同平台的虚拟机与所有平台都统一使用的程序存储格

java类文件结构(字节码文件)

[0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构  的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编号,不关乎博文内容: [1]类文件概述 1)各种不同平台的虚拟机与所有平台都统一使用存储格式--字节码,他是构成平台无关性的基石: 2)时至今日,商业机构和开源机构已经在 java语言外发展出一大批在 jvm 上运行的语言,如 Groovy, JRuby, Jython,Scala等: 3)实现语言无关性的基

Class类文件结构、类加载机制以及字节码执行

一.Class类文件结构 Class类文件严格按照顺序紧凑的排列,由无符号数和表构成,表是由多个无符号数或其他数据项构成的符合数据结构. Class类文件格式按如下顺序排列:   类型 名称 数量 u4 magic(魔术) 1 u2 minor_version(次版本号) 1 u2 major_version(主版本号) 1 u2 constant_pool_count(常量个数) 1  cp_info constant_pool(常量池表) constant_pool_count-1 u2 a

深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

周志明的<深入理解Java虚拟机>很好很强大,阅读起来颇有点费劲,尤其是当你跟随作者的思路一直探究下去,开始会让你弄不清方向,难免有些你说的啥子的感觉.但知识不得不学,于是天天看,反复看,就慢慢的理解了.我其实不想说这种硬磨的方法有多好,我甚至不推荐,我建议大家阅读这本书时,由浅入深,有舍有得,先从宏观去理解去阅读,再慢慢深入,有条不紊的看下去.具体来说,当你看书的某一部分时,先看这部分的章节名,了解这部分这一章在讲什么,然后再看某一章,我拿"类文件结构"这一章来说,我必须

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

从字节码层面看“HelloWorld”

一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 Java 语言服务的,不过随着编译技术和 JVM 自身的不断发展和成熟,JVM 已经不仅仅只运行 Java 程序.任何能编译成为符合 JVM 字节码规范的语言都可以在 JVM 上运行,比较常见的 Scala.Groove.JRuby等.今天,我就从大家最熟悉的程序“HelloWorld”程序入手,

虚拟机字节码执行引擎

在前面的几篇文章里,从Java虚拟机内存结构开始,经历了虚拟机垃圾收集机制.Class类文件结构到后来的虚拟机类加载机制,一步步的进入到了Java虚拟机即Java底层的世界.在有了前面的基础之后,接下来就应该进入Java虚拟机最重要的部分了--虚拟机字节码执行引擎,毕竟,这是Java程序得以在不同机器上运行的核心部分. Java是通过实现Java虚拟机来达到平台无关的."虚拟机"的概念是相对于"物理机"来说的,两种机器都有执行代码的能力,不过物理机是直接面向处理器.

[jvm解析系列][十一]字节码执行之栈帧,你的字节码是如何运行的?

在之前的章节中我们讲解了jvm的内存分配和管理,class的文件结构,就差之行了.那么从第十一章开始我们就开始讲java虚拟机是如何执行一个class文件的. 首先我们应该明确虚拟机是区别于物理机的一种说法,物理机的执行引擎是建立在处理器,硬件 ,指令集之上的.而我们的虚拟机则由自己实现.在虚拟机中大致分为两种执行方式:解释执行和编译执行. 我们之前讲过,虚拟机运行方法的时候运行在java虚拟机栈里面,里面的存储结构是栈帧,需要了解一个虚拟机如何运行字节码文件的,首先我们需要了解一个栈帧的结构.