java class字节码概述

class 字节码概述

每一个java类被编译后都会生成一个对应的.class字节码文件,要想研究JVM加载java类的原理,实现必须掌握java类被编译成的.class文件结构。下面从几个方面来描述字节码的组成格式。

1. class文件构成基础

在class字节码文家中,数据都是以二进制流的形式存储。这些字节流之间都严格按照规定的顺序排列,字节之间不存在任何空隙,对于超过8位的数据,将按照Big-Endian(大端)的顺序存储,即高位字节存储在低的地址上面,而地位字节存储在高位地址上面。这是class文件能够跨平台的关键,PowerPC架构的处理器采用Big-Endian的存储顺序,而x86系列的处理器则采用LIttle-Endian(小端)的存储顺序。因此为了class文件在各种处理器架构下能够保持统一的存储顺序,虚拟机必须设置统一的存储规范。

2. class文件的10个组成结构

class文件主要有两类数据项:无符号数和标。无符号数表示:数字、索引引用和字符串等,class文件中主要使用的无符号数包括:u1、u2、u4和u8,分别代表1字节、2字节、4字节和8字节的无符号数;表是由多个无符号数和其他的表组成的复合结构。
一个class文件主要由以下10个部分组成:

  • MagicNumber u4
  • Version u2
  • Constant_pool u2
  • Access_flag u2
  • This_class u2
  • Super_class u2
  • Interfaces u2
  • Feilds u2
  • Methods u2
  • Attributes u2

3. class文件中各字段说明

  1. MagicNumber:用来标志class文件的,位于java class文件的最前面的4个字节,值为固定的0xCAFEBABE。虚拟机加载class文件时会先检查这4个字节,如果不是0xCAFEBABE,则虚拟机拒绝加载该文件,这样就可以防止加载非class文件而造成虚拟机崩溃。
  2. Version:该字段由2个长度为2字节的字段组成,分别是:Major Version和Minor Version,代表当前class文件的主版本号好次版本号。不同的虚拟机支持的class文件的版本范围是不同的,所以加载class文件之前要先检查class文件是否在当前虚拟机支持的范围之内。高版本的虚拟机可以支持低版本的class文件,反之则不可以。 如果使用高版本的JDK编译java程序,而使用低版本的JRE执行class文件,则JVM会抛出类似“java.lang.UnsupportedClassVersionError: Unsupported major.minor version 50”。
  3. Constant_pool(常量池):常量池信息从class文件的第9字节开始。第9、10字节的长度字段constant_pool_count,表示常量池包含多少个常量。常量池里放的是字面常量和符号引用。字面常量包括文本串以及被声明为final的常量。符号引用包含类和接口的全局限定名、字段的名称和描述符、方法的名称和描述符,因为java语言在编译的时候没有连接这一步,所有的引用都是运行时动态加载的,所以需要把这些引用的信息保存在class文件里。字面常量根据具体的类型分为字符串、整型、长整型、浮点型、双精度浮点型。
  4. Access_flag: 主要保存当前类的访问权限。
  5. This_class:主要保存当前类的全局限定名在常量池里的索引。
  6. Super_class:主要保存当前类的父类的全局限定名在常量池里的索引。
  7. Interfaces:主要保存当前类实现的接口列表,包含两部分:interfaces_count:当前类实现的接口数量,interfaces[interfaces_count]:包含interfaces_count个接口的全局限定名的索引的数组。
  8. Fields:主要保存当前类的成员列表,包含两部分:fields_count:类变量和实例变量的字段数量总和,fields[fields_count]:包含字段详细信息的列表。
  9. Methods:主要保存当前类的方法列表,包含两部分:methods_count:该类或借口显示定义的方法数量,method[methods_count]: 包含方法信息的详细列表。
  10. Attributes:主要保存当前类attributes列表,包含两部分:attributes_count和attributes[attributes_count] 。

你可能感兴趣的:(java,读书笔记)