1.字面量
字面量表示源代码中一个固定值的表示法,比如数字1就是字面量,字符串也是字面量; Java中有整数字面量,浮点数字面量,布尔型字面量,字符字面量,字符串字面量。
2.简单名称
没有类型和参数修饰的方法或字段名称
public class TestClass {
private int m;
public int inc() {
return m+1;
}
}
如上面代码,inc是方法的简单名称,m是字段的简单名称。
3.全限定名
全限定名是将类全名的 "." 全部替换为 "/"
例如 "com/enjoy/learn/core/oop/method/TestClass"
4.描述符
A descriptor is a string representing the type of a field or method.
1)描述字段的数据类型
FieldDescriptor:
FieldType
FieldType:
BaseType
ObjectType
ArrayType
BaseType:
(one of)
B C D F I J S Z
ObjectType:
L ClassName ;
ArrayType:
[ComponentType
ComponentType:
FieldType
数组:每一维度前加一个[
例如:String[][] -> [[Ljava/lang/Object,int[] -> [I
2)描述方法的参数列表和返回值
MethodDescriptor:
( {ParameterDescriptor} ) ReturnDescriptor
ParameterDescriptor:
FieldType
ReturnDescriptor:
FieldType
VoidDescriptor
VoidDescriptor:
V
按照先参数列表,后返回值的顺序描述。参数列表按照参数的顺序放在()内。
void inc() -> ()V
String toString() -> ()Ljava/lang/String;
int indexOf(char[] source, int sourceOffset, int sourceCount) -> ([CII)I
5.符号引用
符号引用用一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。
CONSTANT_Fieldref_info {
u1 tag;
u2 class_index; //类或接口的索引Class_info
u2 name_and_type_index; //字段描述符的索引
}
CONSTANT_Methodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_InterfaceMethodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。