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

在这里插入图片描述

目录
相关文章
|
5月前
|
存储 Oracle Java
JVM中Class文件结构详解
JVM中Class文件结构详解
78 0
|
7月前
|
存储 Java 程序员
【 class文件结构】
【 class文件结构】
|
12月前
|
存储 Java 开发者
【Class文件结构】
【Class文件结构】
|
存储 人工智能 Java
一起来学字节码插桩:从分析class文件结构开始
`Java` 能做到 `一次编译,到处运行`,主要就是靠 `class字节码` 文件,也就是 `java` 文件经过编译之后 `.java -> .class`,然后再被` JVM` 虚拟机加载。其实,不仅是 `java` 语言,只要是符合规则的 `class` 字节码文件,都可以被 `JVM` 加载
111 0
|
存储 NoSQL Java
class文件结构详解
写在最前:学习class文件结构不像学习JVM内存结构、垃圾收集器那样,可以对我们写代码时有很多帮助,学习了JVM内存结构,我们在配置虚拟机参数时就会有更全面的考虑,写代码时就可以注意到代码的的优化空间,学习了垃圾收集器,让我们可以根据服务器的配置,更好的选择出适合程序最大吞吐量的收集器,更好的根据服务器硬件配置出合适的参数,学习class呢,则更多的是为了让我们知其然,也知其所以然,让我们知道我们写出的代码在JVM里面到底是怎么运行的,这部分内容会相对枯燥,白话多一些,这里主要分两个部分来详细讲述class文件的机构[class文件结构、字节码指令]。
102 0
class文件结构详解
|
存储 XML Oracle
【JVM深度解析】Class文件结构
你了解Class文件结构吗?那你知道为什么会有魔数吗?定义的类变量会在什么地方出现呢?...不懂?一文带你了解Class文件结构。
【JVM深度解析】Class文件结构
|
存储 算法 前端开发
JVM Class 文件结构
本文着重介绍 JVM 中 Class 文件相关的内容
|
存储 Java 编译器
JVM的class文件结构详解(一)
JVM的class文件结构详解(一)
105 0
JVM的class文件结构详解(一)
|
Java
JVM的class文件结构详解(四)
JVM的class文件结构详解(四)
85 0
JVM的class文件结构详解(四)
|
存储 Java 编译器
JVM的class文件结构详解(三)
JVM的class文件结构详解(三)
90 0
JVM的class文件结构详解(三)