本文主要是介绍字面量、简单名称、描述符、全限定名及符号引用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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.描述符
参考jvm的官方文档
A descriptor is a string representing the type of a field or method.
1)描述字段的数据类型
FieldDescriptor:FieldTypeFieldType:BaseTypeObjectTypeArrayTypeBaseType:(one of) B C D F I J S ZObjectType:L ClassName ;ArrayType:[ComponentTypeComponentType:FieldType
数组:每一维度前加一个[
例如:String[][] -> [[Ljava/lang/Object,int[] -> [I
2)描述方法的参数列表和返回值
MethodDescriptor:( {ParameterDescriptor} ) ReturnDescriptorParameterDescriptor:FieldTypeReturnDescriptor:FieldType VoidDescriptorVoidDescriptor: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_infou2 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类的地址。
这篇关于字面量、简单名称、描述符、全限定名及符号引用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!