加载(loading):通过一个特定的名字,找到类或接口的二进制表示,并通过这个二进制表示创建一个类或接口的过程。
链接:是获取类或接口并把它结合到JVM的运行时状态中,以让类或接口可以被执行
初始化:初始化一个类或接口——就是执行这个类或接口的<clinit>方法
运行时常量池(在方法区中)
在类或接口C创建的过程中,根据类或接口C的二进制表示中的常量池来创建运行时常量池。
运行时常量池中有许多运行时常量,运行时常量 有的是符号引用,有的不是符号引用
运行时常量池中所有的引用最初都是符号引用,运行时常量池中的符号引用来自于类或接口C二进制表示中的如下接口
1,类或接口C的符号引用——来自类或接口C的二进制表示中的CONSTANT_Class_info结构
类或接口C的符号引用通过调用方法Class.getName()给出类或接口C的名字A——对于非数组来说,A就是类或接口C的二进制名称(全限定名)
对n维数组来说,名称A以n个[ 开头,然后跟上数组的元素类型的名称
例如。int[ ] [ ]——名称为“[ [ I”,Thread[ ] [ ] [ ]——名称为“[ [ [ Ljava/lang/Thread;”
2,C中字段B的符号引用——来自C的二进制表示中的CONSTANT_Fieldref_info结构
C中字段B的符号引用——给出B的名称和描述符,以及一个指向字段B所在类或接口的符号引用
3,类中某个方法E的符号引用——来自类或接口的二进制表示中的CONSTANT_Methodref_info结构
类中某个方法E的符号引用——给出了方法E的名称和描述符,以及一个指向方法E所在类的符号引用
4,接口中某个方法F的符号引用——来自类或接口的二进制表示中的 CONSTANT_InterfaceMethodref_info结构
接口中某个方法F的符号引用——给出了接口方法F的名称和描述符,以及一个指向方法F所在接口的符号引用
5,method handle的符号引用——来自C的二进制表示中的CONSTANT_MethodHandle_info结构
method handle的符号引用 是 ①指向类或接口的一个字段的符号引用 或②指向类中一个方法的符号引用 或③指向接口中一个方法的符号引用
6,method type的符号引用来自于类或接口的二进制表示中的CONSTANT_Method_info结构
这个符号引用——给出了一个方法描述符
7,调用点限定符(call sit specifier)的符号引用——来自类或接口二进制表示中的CONSTANT_InvokeDynamic_info结构。
这个符号引用可以是 ①作为一个bootstrap method为invokedynamic指令服务的method handle符号引用
②一系列符号引用(类符号引用,method type符号引用,method handle符号引用)或字符串常量(string literals)或运行时常量(run-time constant values)——用来作为bootsrap method静态参数的
③方法名称和方法描述符
!!另外,有一些运行时常量并不是符号引用,而是来自常量池表中的某些项——例如字符串常量(string literals)和运行时常量值
9,字符串常量——是一个指向String实例的引用,来自于类或接口二进制表示中的CONSTANT_String_info结构
CONSTANT_String_info结构——给出Unicode code points序列,用来组成字符串常量
(JAVA要求相同的字符串常量,必须指向相同的String实例)
10,运行时常量值——来自于二进制表示中的 CONSTANT_Integer_info
, CONSTANT_Float_info
, CONSTANT_Long_info
, or CONSTANT_Double_info
结构