类文件结构

最开始,代码编译的结果只能是二进制本地机器码,而如今越来越多语言选择了与操作系统和机器指令无关的、平台中立的格式作为程序编译后的存储格式。Java选择字节码作为程序存储格式,即”Class文件“。

注意:任何一个Class文件都对应着唯一一个类或接口的定义消息,但类或接口不一定必须定义在文件中(类和接口可以动态生成,直接送入类加载器中,例如使用反射机制)。

结构

Class文件是一组以八个字节为基础单位的二进制流,Class结构中包含两种数据类型:”无符号数“和”表“。

  • 无符号数属于基本数据类型,用u1,u2,u4,u8代表字节数,无符号数可以描述数字、索引引用、数量值或者字符串值。
  • 表是由多个无符号数或者其他表作为数据项构造的复合数据类型,以”_info“结尾,Class文件也可以看成一张表。

Class文件格式:

组成

魔数

每个Class文件的头4个字节被称为魔数,作用是确定这个文件是否为能被虚拟机接受的Class文件。

版本号

5~8字节存储的是Class文件的版本号

5~6字节是次版本号,高版本的JDK能兼容低版本,但低版本的不能用高版本的。

7~8字节是主版本号,JDK12之前未使用。

常量池

在版本号之后,常量的数量不固定,所以在入口处有一个u2类型的计数值。

常量池是Class文件里的资源仓库,用于存放Class文件与其他项目关联的数据。

属于表类型数据项目。

存放两大常量类:

  • 字面量:类似Java里面的常量,文本字符串、被final声明的常量。
  • 引用常量:包、类和接口的全限定名、字段名称和描述符、方法句柄和类型、动态调用点和动态常量。,这些引用在虚拟机加载Class文件时会动态连接转换成真正的内存入口地址。

访问标志

在常量池结束后的两个字节,用于标识类或接口的访问信息:包括这个Class是类还是接口,是否定义成public类型或者abstract类型,是否声明为final。

索引

包括类索引、父类索引和接口索引,是一组u2类型的数据集合。用于确定该类的继承关系。

  • 类索引:用于确定这个类的全限定名。
  • 父类索引:用于确定这个类的父类的全限定名。
  • 接口索引:描述这个类实现了哪个接口。

字段表

字段表用描述类或接口中声明的变量。

java中的字段(Field)包括类级变量以及实例变量,但不包括方法内部声明的局部变量。

描述信息包括:

  1. 字段作用域,public、protect、private。
  2. 是实例变量还是类变量
  3. 是否可变,被final修饰。
  4. 并发可见性,voaltile修饰。
  5. 是否被序列化,transient修饰。
  6. 字段类型(基本类型、对象、数组)。
  7. 字段名称。

字段表集合不会列出父类或父接口中继承而来的字段。

方法表

方法表用于描述类或接口中声明的方法。

注意:方法表只描述方法,但里面的代码中属性表集合中的Code属性中。

属性表集合

Class文件、字段表、方法表都可以携带自己的属性表集合,用于描述该结构的详细信息。

  1. Code

描述:提供一个方法的字节码指令以及与字节码相关的异常处理表。

用途:将方法的具体执行逻辑封装在字节码中供 JVM 执行。

  1. Exceptions

描述:列出方法可能抛出的异常类型。

用途:在 JVM 执行时管理异常处理。

  1. LineNumberTable

描述:提供字节码指令与源代码行号之间的映射关系。

用途:用于调试,帮助确定执行代码的确切行。

  1. LocalVariableTable

描述:提供关于局部变量的信息,包括名称、类型和作用范围。

用途:在调试期间回溯方法工作时,提供变量的详细信息。

  1. LocalVariableTypeTable

描述:与 LocalVariableTable 类似,但提供泛型局部变量的类型信息。

用途:当使用泛型时,帮助更好地理解局部变量的实际类型。

  1. SourceFile

描述:指向包含源代码的文件名。

用途:为调试工具提供信息,帮助标识源文件。

  1. ConstantValue

描述:指定静态字段的常量值。

用途:在编译时确定静态字段的值,供运行时使用。

  1. InnerClasses

描述:提供有关内部类和嵌套类的信息。

用途:标识内部类的名称、修饰符、外部类的名称和方法信息。

  1. Deprecated

描述:标记一个类、方法或字段为已过时。

用途:告知开发人员该部分不再推荐使用。

  1. Signature

描述:提供对字段或方法的泛型信息。

用途:在使用泛型时,描述类或方法的参数和返回类型信息。

  1. BootstrapMethods

描述:用于支持动态编译的引导方法相关信息。

用途:主要用于 Java 7 引入的 invokeDynamic 特性。

  1. MethodParameters

描述:提供方法参数的名称和修饰符(如 final)。

用途:在运行时通过反射获得参数名称,有助于提高代码的可读性。

  1. RuntimeVisibleAnnotations 和 RuntimeInvisibleAnnotations

描述:分别标识在运行时可见和不可见的注解。

用途:用于反射等情况,根据需要识别注释。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值