返回

Java Class 文件结构剖析

Android

Java Class 文件结构

Java Class 文件是 Java 虚拟机执行 Java 程序的基础,它是一种二进制文件,包含了 Java 程序的字节码、常量池、方法区、字段表、方法表、属性表等元素。

版本号

Java Class 文件的第一部分是版本号,用于标识该 Class 文件的版本。版本号由两个字节组成,高字节表示主版本号,低字节表示次版本号。目前最新的 Java Class 文件版本是 52.0(JDK 8)。

常量池

常量池是 Java Class 文件中存储常量的区域。常量池中的常量可以是字符串、数字、类名、方法名、字段名等。常量池中的常量按照顺序排列,并且每个常量都有一个索引。

方法区

方法区是 Java Class 文件中存储方法的区域。方法区中的方法可以是实例方法、静态方法、构造方法等。方法区中的方法按照顺序排列,并且每个方法都有一个索引。

字段表

字段表是 Java Class 文件中存储字段的区域。字段表中的字段可以是实例字段、静态字段等。字段表中的字段按照顺序排列,并且每个字段都有一个索引。

方法表

方法表是 Java Class 文件中存储方法的区域。方法表中的方法可以是实例方法、静态方法、构造方法等。方法表中的方法按照顺序排列,并且每个方法都有一个索引。

属性表

属性表是 Java Class 文件中存储属性的区域。属性表中的属性可以是类属性、方法属性、字段属性等。属性表中的属性按照顺序排列,并且每个属性都有一个索引。

示例代码

public class Test {

    public static void main(String[] args) {
        String str = "abc";
    }
}

编译上面的代码,生成的 class 文件结构如下:

Version: 52.0
Constant Pool:
  #1 = Class              #2
  #2 = UTF8               java/lang/String
  #3 = String             #4
  #4 = UTF8               abc
  #5 = Methodref          #1.#6
  #6 = NameAndType        #7.#8
  #7 = UTF8               <init>
  #8 = UTF8               (V)V
  #9 = Fieldref           #1.#10
  #10 = NameAndType       #11.#12
  #11 = UTF8               main
  #12 = UTF8               ([Ljava/lang/String;)V
  #13 = Methodref          #1.#14
  #14 = NameAndType       #15.#16
  #15 = UTF8               println
  #16 = UTF8               (Ljava/lang/String;)V
Methods:
  #1 <init> ()V
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #5 // Method java/lang/Object."<init>":()V
         4: return
  #2 main ([Ljava/lang/String;)V
    Code:
      stack=2, locals=2, args_size=1
         0: getstatic     #9 // Field java/lang/System.out:Ljava/io/PrintStream;
         3: aload_1
         4: aload_0
         5: aaload
         6: invokevirtual #13 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         9: return
Attributes:
  SourceFile: "Test.java"

总结

Java Class 文件结构是 Java 虚拟机执行 Java 程序的基础,了解 Java Class 文件结构有助于理解 Java 程序的运行机制。本文详细剖析了 Java Class 文件结构,包括版本号、常量池、方法区、字段表、方法表、属性表等元素,并结合示例代码进行说明。