JVM学习笔记4

51 阅读2分钟

常量池

常量池被比喻为class文件里的资源仓库。主要存放两大类常量:字面量和符号引用。

字面量接近于java的常量概念,如字符串,final常量值等。

符号引用属于编译原理方面的概念,主要包含下面几类常量:

  • 包(package)
  • 类和接口的全限定名(类全名中的.换成/,例如org/sun/TestClass)
  • 字段的名称和描述符(描述符用来描述字段的数据类型,方法的参数列表和返回类型)
  • 方法的名称和描述符
  • 方法句柄和方法类型
  • 动态调用点和动态常量

访问标志

用于识别是类还是接口,以及对final,abstract,anotation, enum, module等的识别。

类索引、父类索引、接口索引集合

class文件中由这三项来确定该类型的继承关系。

类索引用于确定这个类的全限定名,父类索引确定这个类的父类的全限定名。接口索引集合描述这个类实现了哪些接口。

除了java.lang.Object外所有类的父类索引都不为0。

字段表集合

描述接口或类中声明的变量。

Java语言中字段是无法重载的,2个字段的数据类型,修饰符不管是否相同,都必须使用不一样的名称。但对于class文件来讲,只要2个字段的描述符不是完全相同,那字段重名就是合法的。

Java代码的方法特征签名只包括方法名称,参数数量,参数顺序,参数类型(并不包含方法返回值)。字节码的方法特征签名还包含方法返回值和受查异常表。

在Java语言中,要重载一个方法,要求必须拥有一个与原方法不同的特征签名。因为返回类型不包含在java语言的方法特征签名之中,因此java语言里无法仅仅依靠返回类型的不同来对一个已有的方法进行重载。