Class文件结构

1、文件结构

1.1 例图:

输入图片说明

1.2 结构图形

输入图片说明

  • 说明:
符号 中文名 结构 做用 规则
magic 魔数 U4 全部的由Java编译器编译而成的class文件的前4个字节都是 “0xCAFEBABE” ,JVM用来判断是不是可加载的.class文件
minor_version 次版本号 u2 JVM
major_version 主版本号 u2 JVM加载class文件的时候,判断是否可加载,若是JDK.Mj_Version<Class.Mj_Version,则认为加载不了。须要从新编译 JDK1.0->45;1.7->51
constant_pool_count 常量池中常量数量 u2 记录了constatn_pool中constant_pool_info的数量 index从1开始;index=0:某些指向常量池的索引值的数据在特定的状况下表达“不引用任何一个常量池项”
constatn_pool 常量池数据区 constant_pool_info结构 包含Class文件结构及其子结构中引用的全部 字符串常量、类、接口、字段名和其它常量(字面量和符号引用) tag bytes:第一个字节,用于识别哪一种类型的常量。index=constant_pool_count - 1
access_flags 访问标志 u2 表示某个类或者接口的访问权限及基础属性
this_class 类索引 u2 this_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的类或接口
super_class 父类索引 u2 super_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的直接父类
interfaces_count 接口计数器 u2 当前类或接口的直接父类接口数
interfaces 接口信息数据区(接口表) u2 interfaces[]数组中的每一个成员的值必须是一个对constant_pool表中项目的一个有效索引值, 它的长度为 interfaces_count
fields_count 字段计数区 u2 fields_count的值表示当前Class文件 fields[] 数组的成员个数
fields 字段信息数据区(字段表) field_info结构 fields[]数组中的每一个成员都必须是一个fields_info结构 的数据项,用于表示当前类或接口某个字段的完整描述,但不包括从父类或父接口继承的部分
methods_count 方法计数器 u2 methods_count的值表示当前Class 文件 methods[]数组的成员个数
methods 方法信息数据区(方法表) method_info 结构 methods[] 数组中的每一个成员都必须是一个 method_info 结构 的数据项,用于表示当前类或接口中某个方法的完整描述
attributions_count 属性计数器 u2 attributes_count的值表示当前 Class 文件attributes表的成员个数
attributions 属性信息数据区(属性表) attribute_info结构 attributes 表的每一个项的值必须是attribute_info结构 在Java 7 规范里,Class文件结构中的attributes表的项包括下列定义的属性InnerClasses 、 EnclosingMethod 、 Synthetic 、Signature、SourceFile,SourceDebugExtension 、Deprecated、RuntimeVisibleAnnotations 、RuntimeInvisibleAnnotations以及BootstrapMethods属性
  • u四、u二、u1表示几个字节
  • cp_info(Constant_pool_info):常量池中,字符表的数据结构
  • field_info:字段表中数据结构
  • method_info:方法表中的数据结构
  • attribute_info:属性表中的数据结构
1.3 class文件:access_flags:

输入图片说明

2、class文件常量池

2.1 常量池总结
  • 全部 符号(变量、方法、类) 都是经过cp_info结构来表示
  • 同一文件的全部符号(变量、方法、类) 的相同值都会指向同一地址
  • 对全部的基本类型(int、float、long、double) 都是 字面类型+bytes表示
  • 对全部引用类型(String,class),都会用单独的 Constant_utf8_info 构造,而后在经过 Constant_String_info, constant_Class_info 指针只过去
    • 每一个个类而言,其class文件中至少要有两个CONSTANT_Class_info常量池项,用来表示本身的类信息和其父类(Object)信息
2.2 class文件的常量池结构

输入图片说明

2.3 class文件常量池中数据结构

输入图片说明

2.4 cp_info的字面量

输入图片说明

2.5 cp_info表示信息

输入图片说明

2.6 各种型案例
  • int、float型

输入图片说明

  • long、double型

输入图片说明

  • String型引用

输入图片说明

  • String型具体数据

输入图片说明

public class StringTest {  
    private String s1 = "JVM原理";  
    private String s2 = "JVM原理";  
    private String s3 = "JVM原理";  
    private String s4 = "JVM原理";  
}

输入图片说明

  • class引用
    • 先用 javap -v 反编译
package com.jvm;  
import  java.util.Date;  
public class ClassTest {  
    private Date date =new Date();  
}

输入图片说明

相关文章
相关标签/搜索