昨天看到class文件中常量池项的范围包含字面量和符号引用。

类中的常量成员变量是什么(class文件常量池项中符号引用中名词的含义)(1)

字面量中的几大类还是挺好理解的,但是符号引用中的几个名词的意思不是很明确,今天查了下资料。记录一下

符号引用

符号引用以一组符号来描述所引用的目标, 符号可以是任何形式的字面量, 只要使用时能够无歧义的定位到目标即可. 例如, 在Java中, 一个Java类将会编译成一个class文件. 在编译时, Java类并不知道所引用的类的实际地址, 因此只能使用符号引用来代替. 比如org.simple.People类引用了org.simple.Language类, 在编译时People类并不知道Language类的实际内存地址, 因此只能使用符号org.simple.Language来表示Language类的地址。

类的全限定名

Object类,在源⽂件中的全限定名是java.lang.Object 。⽽class⽂件中的全限定名是将点号替换成“/” 。 也就是java/lang/Object 。源⽂件中⼀个类的名字, 在class⽂件中是⽤全限定名表述的。

描述符

各类型的描述符对于字段的数据类型,其描述符主要有以下⼏种基本数据类型(byte、char、double、float、int、long、short、boolean):除 long 和boolean,其他基本数据类型的描述符⽤对应单词的⼤写⾸字⺟表示。long ⽤ J 表示,boolean ⽤Z 表示。void:描述符是 V。对象类型:描述符⽤字符L 加上对象的全限定名表示,如 String 类型的描述符为Ljava/lang/String 。数组类型:每增加⼀个维度则在对应的字段描述符前增加⼀个 [ ,如⼀维数组 int[] 的描述符为[I ,⼆维数组 String[][] 的描述符为 [[Ljava/lang/String 。

字段描述符

字段的描述符就是字段的类型所对应的字符或字符串。

如:int i 中, 字段i的描述符就是 I

Object o中, 字段o的描述符就是 Ljava/lang/Object;

double[][] d中, 字段d的描述符就是 [[D

⽅法描述符

⽅法的描述符⽐较复杂, 包括所有参数的类型列表和⽅法返回值。 它的格式是这样的:(参数1类型 参数2类型 参数3类型 ...)返回值类型

不管是参数的类型还是返回值类型, 都是使⽤对应字符和对应字符串来表示的, 并且参数列表使⽤⼩括号括起来, 并且各个参数类型之间没有空格, 参数列表和返回值类型之间也没有空格。

只是列举了部分,实在是太多了。

,