00:00
那关于这个字面量和符号引用啊,咱们就说到这儿啊,那接下来的话呢,咱就具体来解读一下啊,咱们这个DEMO啊,源程序这个编译之后呢,生成的这个最起码文件,哎,我们看一看这个后边的这个常量池里边这些数据的一个情况啊,这个常量池,常量池啊,咱们说到了包括两部分,一部分呢叫常量池计数器,哎,咱们刚才已经说到了这个16呢,转换为这个啊十进制之后啊,对应的是22,那就意味着我们常量池表里边有20几项数据啊。哎,注意是不是21项啊,哎,应该是22减一对吧?哎,咱们刚才已经说到了过,说到过这个问题了,那就意味着我们从后呢,哎一直走是吧?找21项,那到底每一项数据多长呢?哎,这个不同的这个类型啊,它的长度呢,还是不一样子的啊,因为呢,咱们说呢,一共是21项,那21项这个分别是哪些类型呢?刚才是不是也已经提到了,我们有可能是如下的14种类型中的任何一种。
01:03
那咱不说过了,第一个可能是这种是吧,第二个呢可能是这种,第三个可能是这种,哎,那不同的这个类型的话呢,它占的这个长度啊,哎,也是有所不同的啊,那这个时候呢,咱们就要看一张新的表,那这张表呢,描述的这个信息量呢,就更大一些啊,这个呢是提前我已经是把这个表都给大家画好了啊,那为了咱们在解读的过程当中看的方便,这样我就直接还打开啊,我做这个表格时候的这个Excel了,哎,咱们就看这个啊。看这个,哎跟我其实就从这个截图截到我们这个思维导图里边的,呃,咱们这块呢,就开始看它啊,然后这呢还是列的,咱们一共说是叫十四项嘛,对吧,诶还是这14啊,然后每一项的话呢,这个tag呢,其实只属于咱们这一项的一个部分啊,就是通过这个tag呢来标识,诶它到底是一个比如说method reference还是一个field reference还是一个string的,呃,一个情况对吧?好,那下边咱们就来解读啊,这个呢,就好比是大家学习这个,呃,汉语汉字的时候呢,那个字典一样啊这呢就是咱们这个相当于也是一个字典的一个,呃,这个查找是吧,或者你学化学的时候呢,我们有一个元素周期表嘛,对吧,大家去看了这个表格啊好,那下边呢,咱们来进行一个解读。
02:15
还打开咱们这样的一个这个DEMO的一个字节码啊呃,这儿呢,从零一啊进行开始啊,大概到哪结束呢?诶掐指一算,大家你看到我这标了个74是吧,这个74呢,我用了一个红色,实际上呢,呃,这个提前我这块已经给大家做了一个我自己啊备课的时候做了一个简单的解读,就是到74呢,就是咱们整个的呃,这个常量值表是吧,常量表结束的这个位置。啊,一共呢,就是从0A1直到74,那是我们整个这21项对吧?哎,注意是21项啊,那好吧,咱们就一个一个来看一看,首先呢,应用我们眼帘的呢,这个叫0A啊,那0A的话呢,诶这个一考虑它呢,对应的十进制呢是十好十的话呢,来查询我们的这个表格,10OK叫constant,呃,Method reference啊reference是吧,那它对应的这个呢,这不就是十嘛,是吧?
03:11
在这个是十啊呃,这个职位时在这也写了,那这个是十的话呢,我们会看到它接下来呢,会有两个啊,分别是两个字节的这个数据的占用啊,叫U2和U2U2U2行,具体这个U2代表的这个信息啊,咱们暂时呢,大家先不要过多的去关注,哎,你就知道整个一看这里边儿是不是有五个字节呀,好,那回过来。我们就这样子一下啊,这是一个,然后这是两,呃,这又占两个,然后再占两个,是不是这块就整个啊,表达的就是我们说的第一个这个元素对吧?好,那这第一个元素呢,我用这个,比如说这个蓝色来表示啊,我这就标注一下这个叫蓝色了是吧,然后下边这个呢,就是第二个元素了,这个叫零九啊零九的话呢,那自然而然的就就是就零九呗,是吧,那0999。九过来一看的话呢,是我们这叫a field reference啊,它就应该是这个九,然后下边呢,也是两个UOK,那回过来啊,把它选中这个,咱们再换一个颜色啊,这个交替着来。
04:13
嗯,比如说。嗯,找一个什么颜色。选一个稍微浅一点的吧,啊,这个是吧,啊把它呢跟我们这块啊,再接着配上这两个U2嘛,对吧?哎,这个选中一下好可以了,然后这是第二个元素啊,下边呢,就是第三个元素啊叫零七啊零七就是零七呗,啊转换成十进制还是零七啊嗯,对应呢,是我们这个啊这是七,然后它下边呢,只有一个U2啊这一共呢是算是三个字节对吧?好回过来。那那就是三个字节啊,就到这儿呗,啊这块我们再给大家选中这个啊,这个我就用两个颜色交替出现来表示了,呃,接下来呢,又是个零七啊,刚才咱们说过零七了,那它后边有一个U2嘛,所以这三部分啊,三个字节呢,表示的就是我们说的这个结构啊。
05:00
哎,刚刚用的是这个颜色吧。应该是对吧,好,然后再往后的话呢,这叫0101过来查一下啊,是UTF8啊,实际上是一个这个字符串了啊,这个U在八这样的一个字符串,然后它后边呢,注意这个字符串呢,比较特别啊。怎么叫特别呢?你看我们下边这个结构里边呢,嗯,基本上没有出现过说呃有不确定的这个情况是吧,你看我们随便找一个啊,像刚才我们说到这个十的时候呢,它这样一个这俩字节俩字节五个字节是吧,这都是非常确定的,当然对于我们这个字符串来讲,咱知道啊,字符串呢,长度有的长有的短,对吧?所以呢,哎,它这个信息量呢,稍微的大一些啊,首先是一个U1啊,这个tag值就是一嘛,然后接下来呢,你这个字符串的长度是多少,用这个U2来表示的,好,那举个例子啊。回过来,首先呢,我们是零一了,表示这个字符串了,然后用两个字节来表示,哎,你这个字符串的长度啊,相当于是三个长度,三个长度那就是三个哎U1,注意啊,三个长度指的是三个U1,就是三个字节呗,所以一个两个三个OK,所以这一块呢,整个表达的就是我们的这个哎促号。
06:15
注意啊,这个整个表达就是我们这个字串,所以这个零三的话呢,指的是我们字串的长度,哎,后边呢,哎是三,那你这块呢,就要划回三个U1,诶这个要小心一点啊,然后再往下的话呢,又是零一开头的,哎,这呢是不是就只有一个呀?哎,所以这块呢,我们表达长度是零一,那就只有一个,那就把这个选中就可以了啊这个我们再换一下这个颜色是吧。好,下边呢,又是零一啊,又是个字符串,那又是字符串呢,接着再往后零六啊,那就是六个呗,123456好到这,哎,这个呢,又是一个哎,组串哎,再往后哎,又是个零一,好,还是个组串啊哎,零三那就是三个对吧,三个我们这块把它选中一下啊三个那就到这呗。哎,一定要小心一点啊,哎,三个到这儿OK,然后再往后的话呢,又是个字符串啊,字符串呢,这块有四个四个,那就1234,哎到这儿。
07:11
好,然后再往后,再往后的话呢,这是0FF的话呢,哎,如果大家清楚的话,对应的就是16进制,呃呃,对应的十进制呢,就是15对吧,15啊,那这个还比较长哈,这个一个两个三个了,对吧。哎,换一下颜色啊。然后四五六七八九十十一十二十三十四十五是吧,哎,到这啊。哎,这个我们把它标识一下行,哎,这个呢是一个细致活啊,咱们就一点点的这样,先把这呃茶量池表中的呃所有的这个元素啊,咱们给他先标出来,然后呢带着大家一点点去解读啊,这个是我认为最方便的一种方式啊,要不呢就呃解读这个事儿呢,还是挺崩溃的啊,然后大家呢,也注意听啊,因为下来呢让你自己呢去解读,我估计呢,很多人是没有这个动力呢去做这个事儿的啊,那咱们就一起呢,把这个事儿来带来呢剖析一下啊,以后呢,最起码啊也可以跟别人去说一说,说自己解读过是吧?啊好,接着往后啊,这呢又是个零还是一个字符串啊,这个是12啊12你要一下子反应不过来呢,你这块看一下啊,12。
08:18
啊,对应的这个十进制呢,是18啊,那这个还挺长的啊。啊,首先呢,这里边儿这一个了,对吧。换一个颜色啊。这一个了好两个三个四个五六七八九十,十一十二十三十四十五十六十七好。然后再配一个啊是吧,哎这就够了是吧,好这呢是一个字符串,哎后来哎还是一个字符串,哎大家会发现呢,就是我们这里边这个字符串呢,比较多啊,为什么字符串比较多,这个咱们一会在剖析具体这些项的时候呢,哎,你就知道这个原因了啊,咱们先接着往后说。还是一个字符串四个对吧?啊1234好,然后把它再改一下颜色啊,然后又是一个字符串啊,这个呢是十八十八看一下。
09:09
18呢,对应的是24啊,是24啊,24个这个很长啊,嗯,这个先选中啊,一个两个三个四个五个对吧。好五个,然后呢,我们这一行的话呢,实际上是有16个哈,那五加上16的话呢,是不是就21啊。哎,21对吧,我们把这个就先变成颜色啊,21刚才说呢,一共这是不是有24个呀啊。看这21了啊,222324啊到这就可以好再变上颜色可以了啊,再往后啊,又是个字符串啊三个嘛,是吧,123是这三个好换一个颜色。好,再往后还是字符串啊,三个啊一个两个三个啊选中。
10:00
哎,换个颜色好,再往后还是一个字串,这个是0A啊A的话呢,就是十呗,是吧,哎,先把这个颜色变一下。好十个是吧,好一个两个三个四个五六七八九十好。嗯,再往后啊,哎,这个离74越来越近了,哎,这是九,那就是九个啊,哎,这是这边是有一个。两个啊,三四五六七八九十,哎,好。哎,这样啊好,哎,再往后的话呢,这个我们看到这个叫,哎,这个零零。哎,我们数一下这个数对不对啊呃,这个九呢,就是表示有九个嘛,一个两个三个四个五个六个七个八个九个啊多数一个是吧?哎,怎么说呢,不能是零零开头啊,多数一个啊把这个呢,我们还得给您退掉。哎,这个无填充的好,哎这块来看是叫0C是吧,这个0C啊,这个你要有印象的话,这应该对应十进制的,就12呗。
11:07
啊,不确定的话,你来这看一眼啊,0C12是吧,好12的话呢,我们12看一下。12呢,对应的是我们叫内tap啊,终于不是字符串了,呃,这里边儿呢,又是一个U1,两个U2 OK,两个U2行,那我们就这样子。哎,首先的话呢,是一个它来表示一个tag啊,然后哎,这就算一个U1了,然后两个U2啊一一个U2了,两个U2是不是到这儿啊,好把这个颜色我们变一下。嗯,这是一个啊,然后后来又是个0C啊0C刚才咱们看了就是name type呗,12是吧,哎,Name type好还是一个UE2个U。嗯,这样,然后一个U2。换一个颜色。然后呢,再来一个是吧。嗯,好了,然后再后边的话呢,又是零一啊,还是字符串,这个咱都比较熟了啊,这个是16啊16,哎,对应的又是22啊。
12:07
啊,那就先把这个选中,然后呢,一二三四五六七八九十十一。这样是吧,12,哎,十三十四十五十六十七十八十九二十二一二,哎,到这儿。哎,没问题是吧,好,然后接下来啊,我们又是个零一好零一,这是十是吧,十进制,对于我们这个,呃,结果十。哎,还是十,哎要十是16了是吧?对,十是16了,因为0F是15啊,这是16啊好,那接着我往后数,哎,这个一个两个。来,把颜色我们变一下啊。三四五六七八九十十一十二十三十四十五十六,诶正好呢,是不是就我们到最终的这个结束的位置了。
13:02
好哎,我说下到这儿啊,其实整个呢就够我们,哎叫20,哎一项注意啊,这个16呢,对应我们十进制呢,实际上是22,咱们说过了这个常量池计数器呢,哎,它的这个值减个一,哎是我们对应的这个常量池表中的这个数据的这个项数是吧,一共是21项啊,但为了方便咱们接下来进行解读啊,我这块做一个这个标注啊,这是不是咱们这个第一个呀啊这第一个啊,然后这是第二个。嗯,然后呢,就顺便呢,咱们数数看是不是21个啊,这个是第三个。这是第四个。哎五那如果看视频的同学呢,这块你可以做一个快进也行啊,哎,这个我们就是给这里边儿的每一个项呢,做一个标识。哎,刚才这个是五,这是六对吧。接着这。七。
14:02
八。九。哎,这是十,这个得小心一点啊,做这个标识,这是11。哎,到这啊,这是12。哎,13。哎,这个比较长啊,到这。14。哎,15。16。哎,到这儿。18。嗯。哎,19。
15:01
是九,嗯,到这这是20。哎,再往后,再往后再往后,哎到这儿啊21。诶21,哎正好结束对吧,哎,我们这呢,一共是有21项,所以说呢,我们这个呢,哎叫常量池计数器呢,标识的一共有多少个长度这块呢,我们就后边去解读多少个,哎到此为止,这个我们整个常量池这个数据呢,我们就一个一个的呢,都给它标识出来了。啊,标出来了,然后标示出来之后呢,咱们接下来呢,就可以进行一个一个的细节的一个分析啊,比如刚才我们第一个呢叫0A,这个0A呢,对应的我们说是叫十,这个十里边呢,你看它有一个index,这有index,那这两个是什么意思呢?哎,咱们接下来呢,来进行一个解读啊,哎先把这个表呢先画出来,哎刚才画的过程当中呢,这个也很容易出错,哎大家一定要小心一点。那下来的话呢,大家如果有兴趣的话呢,呃,你也可以试着这样的剖析一下啊,你不一定呢,是用我这里边这个DEMO的这个程序了,你可以自己再换一个代码啊,但是建议大家呢,你刚开始换的这个代码呢,不要写的太复杂,因为复杂之后呢,我们这个经解码文件的这个常量池,咱们说了是整个咱们自解码文件里边比重非常大的,你看现在来看的话呢,基本上就占了一半了是吧?诶它的比重很大,所以呢,如果你这个代码比较大的话呢,空析这个常量池这个数据量也会相当的庞大,那你这块给它分割的时候呢,也就会,呃,这个很费时间啊,我们这个代码比较简单,咱们就有21项是吧?啊,那为什么会有这么多项呢?里边都有哪些信息啊,哎,咱们下边来进行一个解读。
我来说两句