类加载
介绍常量池之前先了解一个命令: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文件中的常量池载入到方法区中,也是普通意义上的常量池。代码运行时定义的常量值也存储到此常量池中。
留言与评论(共有 0 条评论) |