常量池
常量池被比喻为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语言里无法仅仅依靠返回类型的不同来对一个已有的方法进行重载。