Class文件结构分析

简介: Class文件结构分析 1. Class文件的结构概览图 2. 每一项数据说明 类型 名称 数量 说明 u4 magic 1 魔数:确定一个文件是否是Class文件 u2 minor_version

Class文件结构分析

1. Class文件的结构概览图

在这里插入图片描述

2. 每一项数据说明

类型 名称 数量 说明
u4 magic 1 魔数:确定一个文件是否是Class文件
u2 minor_version 1 Class文件的次版本号
u2 major_version 1 Class文件的主版本号:一个JVM实例只能支持特定范围内版本号的Class文件(可以向下兼容)。
u2 constant_pool_count 1 常量表数量
cp_info constant_pool constant_pool_count-1 常量池:以理解为Class文件的资源仓库,后面的其他数据项可以引用常量池内容。
u2 access_flags 1 类的访问标志信息:用于表示这个类或者接口的访问权限及基础属性。
u2 this_class 1 指向当前类的常量索引:用来确定这个类的的全限定名。
u2 super_class 1 指向父类的常量的索引:用来确定这个类的父类的全限定名。
u2 interfaces_count 1 接口的数量
u2 interfaces interfaces_count 指向接口的常量索引:用来描述这个类实现了哪些接口。
u2 fields_count 1 字段表数量
field_info fields fields_count 字段表集合:描述当前类或接口声明的所有字段。
u2 methods_count 1 方法表数量
method_info methods methods_count 方法表集合:只描述当前类或接口中声明的方法,不包括从父类或父接口继承的方法。
u2 attributes_count 1 属性表数量
attributes_info attributes attributes_count 属性表集合:用于描述某些场景专有的信息,如字节码的指令信息等等。

3. Class文件16进制解析

3.1 魔数。
  • Class文件开始是4个字节定义为魔数(Magic Number);
  • 唯一作用:确定一个文件是否是Class文件;
  • 魔数可以自由选择,只要没有广泛使用而且不会引起混淆的即可,这样就不会因为扩展名改变而无法识别;其他许多文件类型格式头都存在魔数,如gif、jpeg等
  • Class文件的魔数为"0xCAFEBABE"(咖啡宝贝),比照ClassFileTest.class如下:
3.2 方法表解析
  • public void bar()
00 01 访问控制符 public 
00 11 这里11是16进制转10进制为17,对应 Constant pool: #17 = Utf8 bar
00 0b 描述符0b是16进制转10进制为11,对应 Constant pool: #11 = Utf8 ()V
翻译过来:public void bar()

00 01 表示有1个属性表attribute_count
属性表attribute_info(u2,u4,u1*length)
00 0c 表示attribute_name_index,索引,这里0c是16进制转10进制为12,对应 Constant pool: #12 = Utf8 Code
00 00 00 38 表示attribute_length,代码占的大小,这里38是16进制转10进制为56,表示bar()方法占了56个字节

00 02 表示max_stack最大栈深是2
00 01 表示max_locals最大变量数是1
00 00 00 0a 表示code_length代码行数,这里0a是16进制转10进制为10

args_size 方法的参数有多少个(默认是this,如果方法是static那么就是0)

对应字节码
   00 02 00 01 00 00 00 0a b2 00 02 b2 00 03 b6 
00 04 b1 00 00 00 02 00 0d 00 00 00 0a 00 02 00 
00 00 0f 00 09 00 10 00 0e 00 00 00 0c 00 01 00 
00 00 0a 00 0f 00 10 00 00  

b2 getstatic
00 nop
03 iconst_0
b6 invokevirtual
04 iconst_1

本地行号表
LineNumberTable:
        line 15: 0
        line 16: 9

本地变量表
LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  this   Lcom/cecjx/TestM;
Start+Length 表示一个本地变量的作用域(0对应行是15,10对应行是17||即表示在该方法中,该变量的作用范围是15行到17行)
Slot 表示几个槽存储
Name 表示简单名字

签名
Signature
伪泛型。

在这里插入图片描述

  • 静态变量初始化
 static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: iconst_2
         1: putstatic     #3                  // Field m:I
         4: return
      LineNumberTable:
        line 12: 0

在这里插入图片描述

目录
相关文章
|
存储 NoSQL Java
class文件结构详解
写在最前:学习class文件结构不像学习JVM内存结构、垃圾收集器那样,可以对我们写代码时有很多帮助,学习了JVM内存结构,我们在配置虚拟机参数时就会有更全面的考虑,写代码时就可以注意到代码的的优化空间,学习了垃圾收集器,让我们可以根据服务器的配置,更好的选择出适合程序最大吞吐量的收集器,更好的根据服务器硬件配置出合适的参数,学习class呢,则更多的是为了让我们知其然,也知其所以然,让我们知道我们写出的代码在JVM里面到底是怎么运行的,这部分内容会相对枯燥,白话多一些,这里主要分两个部分来详细讲述class文件的机构[class文件结构、字节码指令]。
171 0
class文件结构详解
|
存储 Java 程序员
【 class文件结构】
【 class文件结构】
|
存储 Java 索引
(六)-class文件结构
1 什么是JVM的“无关性”? Java具有平台无关性,也就是任何操作系统都能运行Java代码.之所以能实现这一点,是因为Java运行在虚拟机之上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现"一次编写,处处运行".
1149 0
|
存储 Java 开发者
【Class文件结构】
【Class文件结构】
|
存储 Java 索引
Class文件结构
各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石,除了平台无关性,虚拟机的另外一种中立特性——语言无关性正越来越被开发者所重视。在Java发展之初,设计者就曾经考虑过并实现了让其他语言运行在Java虚拟机之上的可能性,他们在发布规范文档的时候,也刻意把Java的规范拆分成了Java语言规范《The Java Language Specification》及Java虚拟机规范《The Java Virtual Machine Specification》。
1018 0
|
Java 索引
Class类文件结构概述
参考文献:周志明《深入理解Java虚拟机》第二版 关于Class文件 class 文件应该是所有 Java 程序员都必定知道的文件,因为我们的 Java 源代码经过 javac 编译以后就会得到这个 class 文件。
1339 0
|
9月前
|
存储 Oracle Java
JVM中Class文件结构详解
JVM中Class文件结构详解
164 0
|
存储 Java C++
JVM的class文件结构详解(二)
JVM的class文件结构详解(二)
127 0
JVM的class文件结构详解(二)
|
存储 Java 程序员
深入理解JVM(七)——Class文件结构
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79612685 什么是JVM的“无关性”? Java具有平台无关性,也就是任何操作系统都能运行Java代码。
1026 0

热门文章

最新文章