字面量、简单名称、描述符、全限定名及符号引用

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:
  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类的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值