Pre
class常量池
Class常量池我们可以理解为是Class文件中的资源仓库。
Class文件中主要由两大部分
- 类的版本、字段、方法、接口等描述信息外,
- 常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。
我们来看下我们天天打交道的class文件十六进制的样子 大致如下
基本含义
通常都是 javap 来生成可读的字节码文件来查看。
或者在idea中装个 jclasslib插件 查看
这里面主要是两个东西; 字面量和符号引用
字面量
么错 就是你想的那个意思: 由字母、数字等构成的字符串或者数值常量 。
比如
int a = 1; int b = 2; String c = "artisan"; String d = "art123";
符号引用
符号引用是编译原理中的概念,是相对于直接引用来说的。主要包括了以下三类常量:
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
刚刚上面的代码
a、b 、c、d就是字段名称,就是一种符号引用,
类的全限定名也是符号引用,
类中的方法名称,()是一种UTF8格式的描述符,这些都是符号引用。
运行时常量池
class常量池现在是静态信息,只有到运行时被加载到内存后,这些符号才有对应的内存地址信息,这些常量池一旦被装入内存就变成运行时常量池,对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用,也就是我们说的动态链接了。
举个例子哈,methodA()这个符号引用在运行时就会被转变为methodA()方法具体代码在内存中的地址,主要通过对象头里的类型指针去转换直接引用。