00:00
下边啊,咱们就开始来啃,先啃第一个方法叫做阴利的方法,它的这个属性,这里边我用这个啃这个词呢,是比较精准的,咱们上边这些呢,其实都谈不上,因为咱们开起来其实还相对来说还挺快的,那下边这块肯大家就看看这里边儿这个细节啊,那么我们先来看这呢,是对于我们这个方法计数器的一个描方法中属性的计数器的描述里边就只有一个属性,好那再往后这块我们开始去解读了,解读首先呢,这块我们看到这是描述什么的呢?那我们就得看一下咱们这个课件。看一下这个属性表,那对于这个属性表的话呢,有一个通用的格式,有一个通用的格式什么意思啊,就是我们这里边这个属性啊,注意挺多的,咱们这个属性挺多的啊,这个属性都有多少呢?这个咱我这块呢,列举出来了一个,列举出来一个,然后呢,大家也可以看那个官网,官网的话呢,咱们打开一下官网这个文件,这个class file里边呢,它的第七项啊4.7就是关专门来说这个叫属性信息的这个通用的这个格式是不是就在这儿嘛,跟我刚才这个课件里边是一样的,只不过我是翻译成这个中文了啊,这个再往下走,那我们就会看到呢,以这个比如说具体的版本来举例,或者是class文件在JDK这个版本来举例,或者呢,是按照我们这个可以声明的位置来举例,这呢就是我们看到的这些属性。
01:23
看到的这些属性,OK,那这个属性的话呢,在我们JDK8当中,一共捋了一下这个我数了数,一共是有23种属性,所以这个属性呢很多,那不同的属性呢,它里边包含的信息量呢,也不太一样,也就是说它这个音符的里边的信息量不一样,所以说呢,我们先给了一个通用的一个格式,整体上来讲的话呢,通常都有这三部分,第一个呢,就是你当前这个属性名的一个索引。就是来刻画你这个属性名字,第二呢,就是你这个属性的长度,然后下边呢,就是你属性这个in for in符里边呢,还会有一些具体的一些信息,对吧?好,那这块呢,我们就看到这个通用的格式了,那咱们首先来解读一下,那那一开始呢,这不是这个U2嘛,U2呢,这标识的叫零九这块我们解读这个属性的话呢,这个不妨,比如我就换一个颜色,咱们就不整个对这个框来进行一个颜色设置,比如我们换一个啊。
02:15
我这块用一个,比如说这个颜色好像不太明显啊。就那个吧。用它这个,我们把它呢,写在哪呢。好像得写到这边了,对吧。嗯,我把这个删一下。把这个呢,往这扩一下。行,嗯,这个颜色我在这块描在这块吧,描述一下。行,这个呢,我们把它称为叫什么叫做属性名的一个索引,对吧?嗯,这个属性名索引,这个属性名索引呢,这块是对应的叫零九,好往上边找一下,找这个零九。哎,找到了这是零九,然后这个是041234这四个对吧,这是咱们的1234第四行,找一下我们这个位置第四行。
03:11
在这零四好,就是像后边这四个从这个开始,那往后呢,数四个大家会发现呢,这对应的这个属性呢,是不是叫扣的属性啊,好,那这时候呢,我们这个属性名就知道了,属性名的一个索引啊,它叫做code,好知道这个叫code之后呢,大家再回到咱们这个课件这块,你就别这块看这个通用格式了,咱们下边呢,是不是就找专门这个扣的这个属性啊。这个属性在方法表里边会出现对吧,那具体的话呢,这个扣的属性它的一个格式呢,我又把这个表呢,给大家列出来了,那咱下边呢,就是把这个为了方便看,我把它呢就盯一下。行,你看这里边这个信息量是不是跟我们那个通用的那个格式就明显不一样了,对吧?好,那我们再回过来,所以这块呢,咱们就是啃啊,一点点啃,首先呢,我们找到这个属性名索引,知道叫扣了,那对应的我们这个叫属性名索引,这不就匹配上了,然后下个呢是U4,四个字节长度,表示我们这个属性的一个长度,那就是1234到这儿呗,我们再换个颜色。
04:10
啊,比如用它这呢叫属性长度,这个属性长度咱们看到了,这写的是38,对应到我们这个十进制38。是不是56啊好,56,也就是说我们当前这个属性整个来刻画这个属性的长度呢,是56,嗯,56对吧,那56呢,大家呢,来数一数,嗯,你会发现呢,这一行其实就是16个,那三行的话呢,是不是48个呀,那接着啊,四十九五十五一五二五三五四五五五六。清楚对吧,所以呢,一直到我们这个位置,就是我提前已经标志好的这个位置,就是我们扣的属性整个它的一个覆盖范围,那后边这块呢,是不是就是我们另外一个方法的信息了呀,OK,行,先到这儿知道了这个56刻画的是什么,就是属性的一个长度,再往后的话呢,叫max stack,哎,我们就称为呢,叫操作站的一个最大的深度。
05:09
就是我们这个数据呗,零二给我们再换个颜色。嗯,这个。操作数站。的一个最大深度,这个咱们前面讲过,这个内存结构说过这个操作是占的这个问题对吧,就是我们这个数据呢,在方法里边去执行的时候呢,我们需要把这个数据先给存放在这个操作站中,那有的时候呢,我们操作站会同时放就是好几个数据嘛,它这个站结构,那你最大的深度是多少呢?这里边儿提到了两个深度。两个深度就能解决我们这个in的这个问题,OK,接着往下看,再又是两个字节,叫max locals,就是我们局部变量表,它的存续空间,说白了就是九表,量表的一个长度也是两个来表示的。这个颜色用它吧。
06:02
叫局部变量表的一个长度,或者叫最大的一个空间。就这意思,那Yi呢,就我们这个内的这个方法里边,我们只需要一个这个呃,长度就可以了。OK,接着往下,下边这个呢叫code LAS是一个U4,就是四个这个长度来表示的,那U4那就是从这到这是不是四个长度啊,这个我们再换个颜色。用它来表示它呢,我们称为呢叫字节码指令的长度。好,四金码指令的长度这个是0A,那对应的是不是就是十啊,对应的是十是什么意思呢?就是我们接下来就是关于这个的方法的一个刻画了,这个方法里边呢,我们说就要直接把指令了,对吧?那这个指令的话呢,就是说有十个长度,那咱们就往后数12345678。
07:06
这是七八了,这个咱们再给它整一个颜色。七八,然后后边呢90就这两个。这呢,就是咱们具体的字节码指令。子节麻麻。指令,那么一提到这个具体的解码指令呢,大家可能就有点懵,说这块呢,怎么也是用这个具体的数值来写的是吧,这个怎么去理解,比如说这里边这个2a 2A到底是什么呢?这个怎么来看呀。你看这块呢,我们借助一个小的技巧,但是大家呢,只要把这个事说通就可以,嗯,这样来看,咱们这个idea里边呢,它不是有一个挺好的特性,就是咱们通过这个接club lab来看的时候呢,它是可以关联到我们具体这个自解码指令的这个意思,咱把这个代码呢,还原成咱们这个,呃,跟这个自解码文件一样的这个结构好,这块呢,我再重新给它做一个编译。
08:07
做个编译,那接下来我们再看一下当前这个DEMO。过来咱们现在呢,看的是不是说这个叫in的这个方法对吧?伊这个方法里边咱们刚才也分析过了,它不就只有唯一这个属性叫做code吧,Code打开之后大家呢,就会看到说哦,这不就是我们所谓的自检码指令嘛,一个两个三个四个五个六个是吧?那诶这里边儿怎么说有十个呢。你看我们这块呢,是不是显示的说这是有这个十个对吧,那这个十个跟这块怎么匹配,大家注意看我这块给你讲你就能清楚了,首先的话呢,我们看第一个叫做LO0 lo0就相当于这块呢,我们是一个引用数据类型的,引用类型的一个这个这个加载是吧,加载到我们这个角标零的这个位置了,那LO0呢,这就是一个自节码,这个自己码指令,准确的说呢,它是一个操作码,对吧,我们点击一下零,它就能够关联到咱们。
09:00
这个Oracle官方Java虚拟规范里边A0它这样一个指令,大家会发现,你看这个A0给它呢,分配的一个数值就是42,对应的这个16进制呢,是不是就是2A啊,你看这个2A,那恰好是不是就是我们这个2A啊。没有问题,所以这个呢,就表示的叫lo的下划线零,然后下边这个呢叫B7,那回过来这个咱不行就先去掉它啊,一会再说这个呢叫VO special啊把它点开。那special呢?大家会发现这是不是就是B7啊?那这个B7呢,对应的就是我们这个B7 OK,这个B7注意后边这块呢,是两个字节来表示的,就是你到底调用的是哪个结构啊,这块指出来叫零一对吧,指出来叫零一,那其实呢,就是我们这里边你会看到的这个结构,那这不是零一吗。这个零一是啥呢?这不又调我们这个四差常量池里边的零一不就是这个结构吗。对吧,加这个结构零一角标,其实呢,就是我们object当中的这个相应的我们定义的这个结构啊。
10:04
对应我们这个结构当中的这个一的这个方法。理解吧,这个我就不在这个资金码里边再去看了啊,然后在后边这又是ALO0 lo0,这不是刚才这两个完了以后,这不又是零吗?LO0完了以后呢,在下边这叫零四。这是不是有一个icon_一把它点开。零四。I cost杠一是不是这个就是零四是吧,就它吧,然后我们现在呢,用的不就是这个嘛,所以这里边对应的。哎,就是我们的这个结构是吧,然后下边又是个B5,那呃是个B5,这个B5的话呢,回过来这个对应的是叫put fields,你看这个put field它是不是一个B5呢?是不是就是B5啊好,这个B5呢,它后边又对应着我们一个具体的数据,就相当于这个呢,我们称为叫操作码,这个叫操作数嘛,这个操作数呢是一个。
11:00
是不是0002啊,那这个零二对应的是谁呢?嗯,找常量池里边一个零二就到这儿了吧,嗯,它指明就我们DEMO里边的一个number的一个属性。Number这个属性OK啊,就是这样个情况,好,然后再我们回过来。在下边儿的一个return return呢,我都不用点开看了,实际上就对应的是我们最后的这个B1啊没问题行,那这块呢,就是我们刚才说到的具体的这个字解码指令。具体资金码指令就这块儿呢,来刻画好了,行,这个我们再回过来,把这个表呢,咱们再给他盯一下。这块呢,大家看起来会稍微的吃一点,因为这里边儿这个事儿啊挺多的啊,这个咱们得一点点的过啊,所以说呢叫啃对吧,那现在呢,我们走到哪了呢?是不是走到这了,具体自解码指令后边呢,又一个U2 u2呢就这呗。这两个呢,衡量的是我们叫异常表的一个长度啊,异常表的长度。再给一个颜色。
12:02
确定这呢,异常表的长度在咱们当前这个题目当中,或者我们这个方法当中,Init里边是没有异常的,所以这边我们看到这个异常表的长度呢,就是零,零就没有了,对吧?这个我们就不关注了,接着往后走,这个呢,就是异常table啊,异常表的情况,这块咱没有吗?没有这块呢,其实就不会有这个信息了,因为只要涉及到表的话呢,它就会先给一个这个表的长度,那咱这块呢,表的长度是零了,后边自然而然也就没有异常表了。那再往后看这个又是一个UR,就是我们属性的一个count,属性的count这块看到是零二。有意思了。我们再给他一个颜色。属性的长度就是或者叫属性的计数器啊。准确的说呢,我这块写这样写一下吧,扣的。哎,中属性的长度,或者叫属性计数器也行。
13:04
中的属性计数器。什么意思啊,诶,我们当年那个code的不就是个属性吗?怎么又有一个属性的挤数器呢?这个意思就是说我们扣的属性当中还可以有属性。再说一遍,扣的属性当中还可以有属性啊,所以这是我们比较绕的一个地方,然后下边呢,就是你下边这个扣的当中的这个属性的一个情况了,它有俩属性。下边就是你具体这个俩属性,从这块儿一直到这块就结束,就这样个场景完事了,这是我们相当于把这个扣属性呢,先做了一个初步的一个解读,那到此为止呢,我们要进入它内部的这个属性了,那我们这块先停一下。
我来说两句