00:00
那咱们呢,已经把这个常量表呢,就是分割出来了,一项一项的了,一共呢是有21项,那接下来的话呢,咱们就细节的来解读一下啊,这里边这个每一项的信息啊,咱们层层递进,终于到了这个最核心的这个部分,那这个解读的话呢,实际上还是比较费眼的啊,这个我们得一点点这样去看,那为了呢,咱们这个在解析的过程当中啊,大家别迷茫了,因为毕竟呢是这种非常抽象的这种16进制的数值了啊,为了避免大家迷茫怎么办呢?咱们前面呢讲过解读这个资金码文件的时候呢,最原始的方式就是我们这样一在这去看,就是咱们现在讲的这种方式,那另外的话呢,像我们扎P指令啊,或者说呢,咱们在之前讲这个上篇啊,包括呢,一开始我们这个讲中篇的时候呢,给大家是不是也使用过这个,使用过这个叫j lab这个工具吧。啊,那我们在这个idea当中呢,直接用这个j lab这个插件,这这这相当于是已经把我们解析好了这种情况对吧?那如果你要不在这看的话呢,大家也可以是不是装一个对应的这种,诶客户端对吧?诶客户端啊,这个软件给大家也提过,就是这个呃j class lab它这个安装完以后的话呢,桌面上我这个自检码文件就默认使用这个接lab呢进行打开了。
01:13
所以双击呢,一点击就开了,这儿呢,我已经打开了。打开以后的话呢,关于我们常量池,刚才咱们提到了针对于DEMO这样的一个资解码文件,一共是有21项,那这里边儿呢,其实它已经帮我们解析出来了,这就是我们刚才看到的这21项,那未来呢,咱们在讲解的时候呢,大家不晕,比如我这块讲着讲着大家已经都懵了,是吧,所以呢,我们结合着这样给大家去看,我觉得呢,这个效果呢会更好一些。把这个稍微放大一点,效果会更好一些,好,那我们看怎么来进行这个对应我们现在呢,是自己原始的方式一点点来解读的看一下,首先呢,针对这个第一项呢,我们说叫0A,咱们刚才那会儿也看到了0A就是十嘛,十不就是我们这个叫相当于我们第一项的类型呢,是master reference。
02:01
它对应的正好是十,那这块是不是第一项就master reference啊好,那第二项的话呢,我们这呢是一个零九,那零九呢,正好十进制呢,也是九,别晕了,咱们这里边儿全是16进制啊,这个也是九,那九的话呢,对应过来。九是不是就我们这里边这个叫呃,Field reference啊,那这个不就是field reference吧,那随便的你这个再去举例,比如说我们再看一个第三项,这个呢,咱们叫零七十进制呢,也是0707过来是不是叫class in for啊,那是这就class in for100包括呢,我们刚才在一个一个分割的时候,大家会发现零一特别多,零一呢,因为是字符串的情况,所以你看下边这这么多,是不是也对应的就是我们字符串的情况,对吧,相当于呢,就是我们通过刚才这个自己一点点去看的时候呢。如果你要用接club z这个工具,它帮我们就是能够呈现出来每一项常量表中的这个类型,你看这一共就列出来了,好,那咱们这块呢,就是自己在分析的同时呢,咱们看一看这个大方向,借助于它方便呢,咱们去做一个解读啊,要不很多同学就懵了,咱咱有同学说这是不可能懵,来咱们看一下,看看你会不会蒙啊,这个0A的话呢,我们说它表示的叫method reference,后边呢有两个U。
03:16
这个U是什么意思呢?看一下我们的表格。就这个呗,这个UR呢,表达的是指向方声明方法的类描述符,它对应的它会指向一个叫做class符的一个索引项。这个什么意思啊,就是说你这不是定义描述一个方法的嘛,是吧,描述这个方法的一个符号引用方法的话呢,我们说最起码你得告诉我这个方法名吧。哎,当然方法名不是,这不是这一项啊,是这一项来做的事,这一项其实是,呃,告诉我这个方法呢,它是哪一个类声明的,你叫的是哪一个类中声明的这个方法是这个意思,这就关于这个类的一个描述,所以说你可以看到它指向的是一个class in for,那在我们这里边它的值是零四对吧,零四呢,注意16进制的1004也是十进制的零四,那就找零四。
04:03
它就是零四这个零四这一项,其实不就是我们里边的这一项吗。这不就零四嘛,相当于呢,就是我们在这个method这样,我在这这定一下哈,我们这个method reference里边呢,它有一个U2,后边还有个U2,第一个U2呢,指明这个方法的类型,这个类型呢,是不是就指向了我们这个这个这一项了。对吧,指向它这一项,那这一项的话呢,咱们看到这个值是不是15啊,小心一点啊,15的话呢,是16进制,转化成十进制的话呢,就是21。这个是2121是不是就我们最后一项啊,最后一项哎就指向它了,相当于呢,我们哎这个类型呢指向它,它呢,是不是里边又指向了它呀,那最后这呢是一个字符串,那注意一下,你看我这里有个关系啊。我这就不截图了,接着这个关系现在到21了,那我们看下这21 21的话呢,它描述的实际上是一个字符号的信息啊,自变量的一个信息长度是十,就是从6A1直到74就结束,那为了方便我们去解读这个6A到74呢,咱们再用一下这个这块呢,因为它帮我们翻译成最近的这个X码哈。
05:05
嗯,6A就它呗,6A对应的我们这个二次码表现出来的实际上是这个阶,然后在61呢是A啊,然后再往后76呢,是这个V啊,其实你这块看它也行,看它的话呢,其实你不就看到这就是j AV,那一直到我们这个74,你就往这块一个一个往后走,你往后看。到TT这一块呢,是不是正好就是74啊。所以呢,大家注意我们刚才呢,是不是从这个JAVA1直到我们这个object,相当于我们当前这个方法,你的类型是哪里定义的呀,是Java long包下的object这个类定义的,我们把它呢称为这不叫全限定名吗。这是不是就找到你这个方法定义这个方法的类啊,是哪一个类了,对吧?好这呢,就是咱们刚才分析的这个信息,得到的最终呢,是指向了是21这个字符串啊,自变量的信息。
06:00
那接着我们再看后边这个叫零零十二。对吧,哎,零零十二,那回过来看一下这个表。这个它呢,描述的就是你当前这个方法的名称和类型描述符,方法名称不用多说了,每个方法都有名,类型描述符呢,涉及到你这个方法的反回值类型啊,方法的形参啊,哎,这样的问题就是指的是它,那这个呢,指向的是一个叫内type的一个缩引项,咱们这个值呢,看到是不是叫12啊,注意12翻译成咱们的十进制。是不是18 18的话呢,那你这块就找这个18。其实你这块大家看一下这也行啊,18是不是恰好也确实是一个内版type的一个索引,只不过我们找这个索引不是19的啊,19也是一个内版type,我们现在要的是18。嗯,找一下这个18。17这个是18 18找到它了,这个18的话呢,它也有两项,一个叫零七,一个叫零八,那咱们看一下这个。
07:05
内type它的一个描述。嗯,内曼肽的这个描述的话呢,这个刚才看到这个值是零七,这个叫值是零八,这个呢表明的是你这个,嗯,方法字段,咱不是字段,现在看方法嘛,就是方法名称是什么,下面就是一个方法描述,描述符是什么,0708,这不对应的也是这个。哎,咱们十进制的也是这个七跟八,那就回过去找这个七跟八,哎,这是七。嗯,后边这个是八行,这呢,都是两个租号信息了。啊,就别蒙了啊,看看现在我们说到哪了,刚才呢,这里边有一个U2的表示的类型,咱们解读完了,类型呢是先指向零四,零四是不是就指向最后一项了,嗯,没事是吧,没问题,然后后边还有一个这个U2,这个U2呢,是你这个方法名和方法的这个描述符,它呢,刚才咱们看到是指向的是多少啊。嗯。这个是吧,十二十二刚才是多少来着,是18是吧,那它呢,指向的是18,那不就指向这儿了吗?相当于我们这个呢,就先找到这了,然后找到它的话呢,这个18里边有一个零七,一个零八,这个0708呢,十进制也是0708,那你接着去找零708。
08:17
就是这一项和这一项呗,这不就找到这两项了,那这两项呢,一个用来描述当前这个方法的名称,一个呢,用来描述当前这个方法的返回值类型和它的形参列表。0708,我们看代表的字串信息是什么呢?0708。嗯,是这块的对吧,那咱们来这块来看一下吧。哎,他呗,哎,这个呢,你看是六个啊嗯,123456,那你看对应过来就是我们的这个。这正好是六个嘛。In,这个就相当于是我们这个方法的名字,然后再往后呢,有三个三个的话呢,这是零八嘛,哎一个两个三个,那对应到我们这儿的是不是就这三个呀。
09:06
相当于指明我们这个方法的返回值类型和它的这个行参的列表供参的OK,那至此的话呢,注意至此咱们仅仅把第一项呢解读完了。也就是说我不懵,呃现在其实已经有点懵了是吧,呃,还是啊,记得刚才我们说这个事儿这一项呢,描述的是你当前因为整个类0A呢,表述的是一个呃0A0A我们说是十是吧。诶错了,嗯,零一呢是我们看这是你第一项啊第一项然后呢,对应的呃,这个tag呢,我们说表示的叫方法的一个描述,方法描述后边呢,一个是表示你这个方法它所属的类,呃另外一个呢,是方法的名称啊内type嘛名称和它的这个反问类型参数列表这个情况,那最终目的呢,大家发现关于这个类型这块呢,虽然指向的是这个零四,但是零四是不是最终又指向的是这个字串信息啊。
10:00
然后呢,关于我们这个方法的名称和它的这个描述符的信息呢,最终呢,我们是不是指向这个0708了呀,相当于我们最终的落脚点都到了这个字符串的这个维度上。哎,都到这个字串上行,这个呢,注意仅仅是咱们关于第一项的一个描述。关于第一项的一个描述,那后边这一项是不是都按照我们刚才说的这个思路,大家去实施就可以了呀。好,哎,那关于这个第一项,咱们先停一下。
我来说两句