00:01
那class文件版本号之后啊,咱们接着来说这个class的剩下的这个结构,那第三个结构呢,我们就提到了,叫常量池,那常量池顾名思义呢,就是来存放常量的,对吧?哎,我们称为呢叫做常量池,那常量池呢是class文件当中内容最为丰富的区域之一。呃,这里边我们把这个质疑去掉啊,其实也不为过啊,叫内容最为丰富的区域,呃,怎么讲呢,我们可以把这个常量池啊,看作是咱们class文件的一个资源仓库。啊,一说到资源仓库呢,大家应该不陌生,这两个词就好比是呢,比如说你开了一家汽车修理厂,那汽车修理厂的话呢,我们都会有专门存放这个汽车这些配件的啊,一些工具啊,还有这些配件的一个仓库,那这个仓库呢,就类似于我们这里边儿的常量池。哎,就是这个概念,那常量池里边主要呃,提供的一些哪些信息呢?呃,下边提到了。咱们class文件当中的这个字段还有方法在解析的时候呢,诶,我们需要呢,表明你这个字段名方案名是什么,字段类型是什么,方法的返回值类型是什么,方法的这个行参是什么,那么这些信息那它其实都存储在常量池当中,所以说对于我们解析字段和方法的话呢,又起到至关重要的作用啊,这个呢,咱们下边一讲这个常量池啊,一讲这个字段和方法,大家就能明白常量池这样的一个关键作用了啊呃,另外呢,我们说随着障碍虚拟的不断发展啊,说常量池的内容呢,也日渐丰富,可以说呢,常量池是整个class文件的基石啊,这个日渐丰富,也就是说呢,我们随着JDK版本的变化呢,这个常量池的这个数据呢,也会有一些调整啊,这里边就提到了一个点啊,这个我们看一下。
01:41
嗯,这边这个表格。这个表格里边呢,咱们简单先看一看啊,一会儿我们具体要说,呃,往下整个一数是有十四项啊,是有十四项,那么这十四项的最后这三项。哎,这三项呢,实际上是在我们这个JDK7的时候呢,添加进来的,是基于我们张杰的一个动态的一个特性啊,这呢,我们加入了三个这个,呃类型啊,那这呢,就相当于就提到了我们在不同的版本当中,它会有一个调整啊,呃,可以说常量池呢,是整个class文件的基石,前面呢我们也提到一个基石,就是说class文件是咱整个扎瓦逊尼的一个基石,那这个。
02:18
嗯,常量池呢,又是class文件的一个基石啊,可见呢,它的一个重要作用啊,嗯,在我们这个官方文档当中啊,大家如果想看一下说关于这个常量池的一个介绍啊,大家就往后找就行啊,找到这个叫4.4.4。在这一部分啊,叫the constant啊,Constant po啊,这就是这个常量池这样一个概念啊,这下边也提到它内部存放的这样一些,呃,这个结构啊,好,那咱这块呢,就不再去看这个官方的这个文档了,这块呢,把核心的内容我们都抽取出来,咱直接来看这个课件就行,好看这块描述哈,说在版本号之后啊,紧跟着的是常量池的数量,以及若干个常量池的表象,这块呢,想说的就是我们常量池嗯,包含的几个结构啊。
03:03
我们来看一下这个图,前面前面呢已经说过了,这个叫魔术,这个呢叫副版本,这个叫主版本,这个四个字节是加一起呢,也是四个字节在后边呢这两项。诶,这个两项就是我们现在要提到这个常量池。这个常量池呢,准确的来说呢,是分成两个部分,嗯,一个部分呢叫常量池计数器,一个呢叫常量池表,那主要原因呢,是因为我们常量池表的它这个个数啊,是不确定的表嘛,是吧,它的个数不确定,那既然不确定呢,我们就需要呢,提前提供一个计数器,哎,这个给我们一个指示,说你到底常量池表中有多少项啊,就这个意思,那这个常量池计数器的话呢,是两个字节啊,后续大家都会看到,凡是涉及到这种计数器的。对吧。哎,这种都是啊,这也是计数器啊,都是两个字节啊,这要注意一下,那一般的有这种计数器的,紧跟着它后边的通常都是一个表啊,这个应该是一个套路啊好,那这两项呢,就是我们要说的这个事儿,呃,常量池计数器啊,常量池表啊,先明确这个概念啊,其实核心的内容呢,一定是呃常量池表了,但是呢,呃,由于我们没有呃子子解码文件当中没有这个叫分隔符嘛。
04:13
所以我们必须引入一个叫计数器这样的概念啊。呃,这呢,下边就说的这个事儿啊,U22个字节嘛,对吧?呃,这里边需要注意这个点呢,就是嗯,我们在讲数组的时候呢,角标都是从零开始的,当然对于我们这个常量池表来讲啊,它的这个计数器呢,是从一开始的啊,一会儿我们再描述一下这个问题啊,嗯,这是这个事儿,然后的话呢,我们再提到这个常量尺表,常量吃就是我们核心的。哎,这一部分内容,哎,常量值表这一块对吧,那这一块里边放的又是什么呢?我们说主要放的呢,叫做字面量和哎符号引用。哎,自变量和符号引用,然后这部分内容呢,当我们使用java.ex命令啊,把它加载到内存之后,常量池这些数据呢,在我们内存当中是存放在叫方法区的运行时常量池当中的。
05:04
你看这个大家稍微关注一下这个事情啊,当然这里边还有一个特别的概念,就是字符串常量池,在这个JDK迭代的版本当中,我们后续呢,JDK7以后把这个字符串常量值是放在对空间里的啊,这个一个特殊的事儿啊,大家需要关注一下,那其他这个内容的话,我们都是存放在叫呃运行时常量值当中,是在我们的方法区,那GB8以后呢,我们落地的实间呢,叫做圆空间对吧?那这个我们前面都讲过啊,好,那通过刚才这个讲解呢,大家需要掌握这个两个事儿啊。一个呢,就是我们这个常量池呢,是非常重要的啊,然后呢,它主要包括两项,一个呢是关于它的,呃,常量尺表的一个长度,一个呢是关于常量池表。啊,然后常量指标里边主要放的是自变量和符号引用,哎,这就可以了。
我来说两句