JVM-Class类文件的结构

一、Class类文件概述

1、Class类文件是一组以8位字节为基础单位的二进制流,当遇到8位字节以上的数据项时,则会安照高位在前的方式进行分割成诺干个8位字节进行存储。

2、构成:无符号数、表

3、无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表一个字节、两个字节、四个字节、八个字节的无符号数。无符号数可以描述数字,索引引用,数量值,或者安装UTF-8编码构成的字符串值。

4、是多个无符号数或其他表构成的复合数据类型,表都习惯以"_info"结尾。

5、描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器和诺干个连续的数据项的形式,这称为某一类型的集合。


二、class组成介绍

1、1-4:魔数。每个class文件的头4个字节称为魔数,唯一作用,用于确定这个文件是否是一个能被虚拟机接收的class文件。

2、5-8:class文件的版本号。5-6是次版本号,7-8是主版本号

3、9-?:常量池。

常量池=容量计数值+常量池项目

容量计数值:表示常量池中有多少个常量池项目(u2类型)

容量计数值从1开始计数,0空出来,表示不引用任何一个常量池的项目。
常量池项目= 标志位(tag)+常量池项目类型

标志位:表示该常量代表什么常量类型
常量池项目分为:字面量、符号引用。
常量池项目特点:1、每一个常量池项目都是一张表,2、开始的第一位是一个u1类型的标志位
符号引用分为:类和接口的全限定名、子段的名称和描述符、方法的名称和描述符

常量池之后的2个字节
?-2访问标识(access_flags):用于识别一些类或接口层次的访问信息。
1、一共有32个标志位可以使用。

类索引、父类索引与接口索引集合
1、Class文件由类索引、父类索引与接口索引集合来确定这个累的继承关系。
类索引(2个u2):确定这个类的全限定名。
父类索引(2个u2):确定这个父类的全限定名。
接口索引集合:用于描述这个类实现的那些借口。

子段表集合:描述接口或类中声明的变量,子段表包括类级变量或实例级变量,但是不包括方法内变量。
子段表集合 = 容量计数+ 子段表
子段表= 子段作用域+static+可变性+并发可见性+是否序列化+子段数据类型+子段名
com.adolph.test.TestClass
全限定名:com/adolph/test/TestClass;
简单名称:没有类型或参数修饰的方法或名称
描述符:描述子段的数据类型,方法的参数列表(数量、类型、顺序)和返回值
数组:每一维度将使用一个前置“[”字符描述
如:lang.String[][] ----->  [[Ljava/lang/String;
方法:先参数列表,后返回值的顺序描述,参数列表安装参数顺序严格顺序放在一组小括号中。
如:void inc() ----->()V
如:int test(int a,double c) ------>(ID)I

方法表集合类似于子段表集合

你可能感兴趣的:(java学习)