Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池 (Constant Pool Table),用于存放编译期生成的字面量和符号引用,这部分内容(也可以称为 .Class 文件中的静态常量池)将在类加载后进入方法区的运行时常量池中存放。
字面量
比较接近 Java 语言层面的常量概念,如文本字符串、声明为 final 的常量值等。(final 修饰的成员变量和类变量【类变量:静态成员变量】)
符号引用
符号引用就是字符串,这个字符串包含足够的信息,以供实际使用时可以找到相应的位置。
你比如说某个方法的符号引用,如:“java/io/PrintStream.println:(Ljava/lang/String;)V”。里面有类的信息,方法名,方法参数等信息。
当第一次运行时,要根据字符串的内容,到该类的方法表中搜索这个方法。
运行一次之后,符号引用会被替换为直接引用,下次就不用搜索了。
直接引用就是偏移量,通过偏移量虚拟机可以直接在该类的内存区域中找到方法字节码的起始位置。