From 46422ff4d70d0d574d69427a5cd82cff784c32cf Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 16 Apr 2019 08:12:56 +0800 Subject: [PATCH] =?UTF-8?q?Create=20Class=20=E6=96=87=E4=BB=B6=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=80=BB=E8=A7=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Class 文件格式总览.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 blogs/JVM/深入理解 Class 文件格式/Class 文件格式总览.md diff --git a/blogs/JVM/深入理解 Class 文件格式/Class 文件格式总览.md b/blogs/JVM/深入理解 Class 文件格式/Class 文件格式总览.md new file mode 100644 index 0000000..09a6da4 --- /dev/null +++ b/blogs/JVM/深入理解 Class 文件格式/Class 文件格式总览.md @@ -0,0 +1,39 @@ +--- +Class 文件格式总览 +--- + +#### 文件格式总览 + +```xml +ClassFile{ + u4 magic; + u2 minor_version; + u2 major_version; + u2 constant_pool_count; + cp_info constant_pool[constant_pool_count-1]; + u2 access_flags; + u2 this_class; + u2 super_class; + u2 interfaces_count; + u2 interfaces[interfaces_count]; + u2 fields_count; + field_info fields[fields_count]; + u2 methods_count; + method_info methods[methods_count]; + u2 attributes_count; + attributes_info attributes[attributes_count]; +} +``` + +#### 简要说明 + +首先说明的是,以上的 u2 代表这个域长度为 2 个字节,u4 即代表 4 个字节。 + +1. 根据规范,Class 文件前八个字节依次是 magic 魔数(取值必须是 0xCAFEBABE)、minor_version(次版本信息)和 major_version(主版本信息)。 +2. constant_pool_count 表示常量池数组中元素的个数,而 constant_pool 是一个存储 cp_info 的数组。每一个 Class 文件都包含一个常量池。注意,cp 数组的索引从 1 开始。 +3. access_flages,标明该类的访问权限,比如 public、private 之类的信息。 +4. this_class 和 super_class,存储的是指向常量池数组元素的索引。通过这两个索引可以知道当前类的类名以及父类名,只是类名,但不包含包名。 +5. interfaces_count 和 interfaces,这两个成员表示该类实现了多少个接口以及接口类的类名。和 this_class 一样,这两个成员也只是常量池数组里的索引号。真正的信息需要通过解析常量池的内容才能得到。 +6. fields_count 和 fields 包含了成员变量的数量以及它们的信息,成员变量信息由 field_info 结构体表示。 +7. methods_count 和 methods 包含了成员函数的数量以及它们的信息,成员函数信息由 method_info 结构体表示。 +8. attributes_count 和 attributes 包含了属性信息。属性信息由 attributes_info 结构体表示。属性包含哪些信息呢?比如调试信息就记录了某句代码对应源文件哪一行、函数对应的 Java 字节码也属于属性信息的一种。另外,源文件中的注解也属于注解。 \ No newline at end of file