摘要:#17 = Utf8 ()V。#10 = Utf8 Ljava/lang/String。

类加载

介绍常量池之前先了解一个命令:javap

下面说一下常用指令:

javap -s 查看目标类的内部类型签名信息(描述符),包括:字段类型签名,方法的类型签名

javap -c 对目标class反编译,可以查看指令的执行过程。

javap -v 类的附加信息,可以用来查看常量池,也是我们今天需要用到的命令。现在进入正题---常量池。

jvm常量池其实包括两中类型:

1.编译时常量池(静态常量池)

所谓编译时常量池,就是我们把源码编译成class字节码是生成的常量池,我们可以通过javap -v命令查看。内容如下: Constant pool:

#1 = Methodref #8.#25 // java/lang/Object."<init>":()V

#2 = String #26 // ss3333

#3 = Fieldref #7.#27 // com/yanyuman/test/Test.ss3:Ljava/lang/String;

#4 = String #28 // wwwww

#5 = Fieldref #7.#29 // com/yanyuman/test/Test.sss22:Ljava/lang/String;

#6 = Fieldref #7.#30 // com/yanyuman/test/Test.ss2:Ljava/lang/String;

#7 = Class #31 // com/yanyuman/test/Test

#8 = Class #32 // java/lang/Object

#9 = Utf8 ss

#10 = Utf8 Ljava/lang/String;

#11 = Utf8 ConstantValue

#12 = String #33 // 1234

#13 = Utf8 sss22

#14 = Utf8 ss2

#15 = Utf8 ss3

#16 = Utf8 <init>

#17 = Utf8 ()V

#18 = Utf8 Code

#19 = Utf8 LineNumberTable

#20 = Utf8 getStr //方法名称

#21 = Utf8 ()Ljava/lang/String; //修饰符

#22 = Utf8 <clinit>

#23 = Utf8 SourceFile

#24 = Utf8 Test.java

#25 = NameAndType #16:#17 // "<init>":()V

#26 = Utf8 ss3333

#27 = NameAndType #15:#10 // ss3:Ljava/lang/String;

#28 = Utf8 wwwww

#29 = NameAndType #13:#10 // sss22:Ljava/lang/String;

#30 = NameAndType #14:#10 // ss2:Ljava/lang/String;

#31 = Utf8 com/yanyuman/test/Test

#32 = Utf8 java/lang/Object //类全限定名

#33 = Utf8 1234 //字面量

上面是class常量池的内容,通过分析可以看出constant Pool的结构和内容。

常量池内容如图3:

图3

那字面量又是什么呢?

文本字符串

八种基本类型的值

如 int a=10; 10即为字面量,

String ss = "string"; "string"就是字面量。2.运行时常量池

运行时常量池就是在类被加载时,将class文件中的常量池载入到方法区中,也是普通意义上的常量池。代码运行时定义的常量值也存储到此常量池中。

相关文章