00:00
前面咱们提到关于这个属性啊,咱们一共是有三个对吧?那其中一个的话呢,是在我们这个in利的这个方法里边,它是有一个扣的属性,然后呢,第二个呢,是在咱们这个at的方法里边有一个code得属性,当然呢,Code得属性里边呢,又包括叫,呃,咱们提到了一个叫做line number table,一个呢叫local variable table这样两个内部的这个属性,所以解读起来呢,咱们会看着稍微的复杂一些啊,那整体上来看的话呢,我们还有一个属性,就是咱们最后这块呢,还有一个属性,这个属性的话呢,对应的就是咱们整个这个,嗯,Class文件结构里边的第八项叫属性表集合,对吧?这个属性表集合呢,我们说主要呢,它这块刻画的就是class文件所携带的这个辅助的信息。所携带的一个辅助信息,那既然呢,人家是一个属性表集合嘛,所以呢,它也会有一个呃计数器,然后呢,再是你具体的一个属性表,那咱们来看一下,这里边儿呢,首先提到这个属性表,属性表这个计数器是零一,也就是说呢,我们只有一个属性对吧?好,我们把这个呢做一个标识。
01:07
嗯,这个我用这个比较浅的颜色,那咱在这块写一下。我把这个呢就称为叫附加属性,嗯,附加属性计数器。行,附加属性计数器呢,这块只有一个,也为咱们后边呢,就只有一个属性行,那么这个属性的信息呢,就是后边的一个情况了,那这个具体信息的话呢,咱们按照前面分析这个属性咱都知道,属性的话呢,它虽然说有一些个性化的对吧,不太一样,但是通用的话呢,他们都首先上来呢,都是关于这个属性名的一个索引,是两个字节,所以这块呢,也自然而然的,这两个字节呢,就是属性名的一个索引。嗯,咱们在这先写上属性名的索引,那所以的话呢,自然而然也就会指向咱们说的常量池,对吧,这呢是一个十,那过来十。
02:02
十十对应的话呢,是十进制的这个16好16,那我们这块呢,找一下这个16。这是11。啊,这个是16,好,那这个16的话呢,这个也是个字符串吧,嗯,是0a 0A的话呢,这是十个吧,那往后的这个数十个就行,对吧?好,你找一下这个零一这块。第一这块,嗯,在这儿呢,啊,这是十个对吧,老数从这从这开始,这是第一个第二个第三四五六七八九十,诶正好十个,那当前我们这个附加属性的话呢,名字就叫做south fair。那我们这个属性名呢,就叫做source file,好知道这个属性名了,那接下来属性名知道之后呢,后续这个情况是什么呢?那咱们就不能自已想当然了,咱们就得过来看一下这个课件,这呢是咱们一个通用的格式,通用格式呢,我们看看有没有关于这个source file的一个特别的这样的一个说明,这呢我找一下我这个课件。
03:00
诶找到了,我这有个叫south,这个south fair呢,它的特殊格式呢,就是长这个样子的,那我们就把这个呢,可以盯一下。但是大家注意呢,我这里边写的呢,没那么全,咱不是说了关于这个属性的话呢,在JDK8当中一共是不是有20有一共是不是有23个呀。23个对吧,哟,就变小了,我这呢,没有把每一个属性它的特殊结构呢都写出来,大家如果有兴趣的话呢,是不是可以看一下咱们这个Oracle官方是吧,官方你看给我们提供了是不是有这样的一些属性,大家呢,你想感兴趣哪一个,比如说咱们现在是不是提到的叫south Co south fair是吧,关于它的话呢,你点一下这个。这就是关于它的一个特殊的结构,我只不过把它翻译成这个中文而已,啊,翻译成中文而已,好,那咱们现在要解读它了,这个看一下,首先呢,是关于你这个属性名字,咱们说了已经是叫s be了,在后边呢,有四个长度表示呢,当前属性的长度往这一拽就插呗。这个呢,我们称为呢叫属性的长度,这个属性的长度呢,我们看到这个值是二。
04:06
这个二属性的长度是二,它的它倒还不是像咱们这个一开始讲的这种通用格式,这有一个长度,因为下边呢还会有一些属性,那属性表呢,不知道你有几个,我们这指明个长度,这个呢,已经说就这一个属性呢,它下边也没有说还有属性,所以它怎么说长度是二呢。这个一开始的时候我也有点莫名其妙啊,那看一下咱们官方这个文档,诶就豁然开朗,你看我们这个south file关于这个属性的描述,你那attribute lengths,所以这里边儿呢,每一个属性里边的这个细节,大家只要不清楚,都来看一下官方这个文档就行。这个关于我们这个属性的长度这块写说attribute lengths,关于我们这个south file attribute,它的这个item的话呢,始终是一个二。所以这个值呢必须是二,所以这块呢,大家就不用有什么疑问了,它没有特别具体的这个含义了,你就知道呢,这个哎长度呢是二就可以了,行,那这个疑问呢就解决了,然后再往后的话呢,叫so file_index叫源码,源码文件索引。
05:13
嗯,在这儿。源码文件索引。好把这个颜色呢,我们也给它变一下,什么叫原码纹,诶这个上面这个颜色没给人变啊。哟,这个字体也变了,换一下。这个什么叫源码文件,所以呢,咱们先看一下这个具体的数据,这个呢是11 11咱们最后一个终于到最后了,这个11的话呢,对应的十进制呢是17,好回过来咱们找一下这个17。这是十七十七,然后呢,这边是44,这是我们的第一个数据,那咱们过来看一下这个44啊在这儿呢,这是第一个,一共是九个嘛,这是第一个第一个,然后第23456789,好这个呢叫demo.java demo.java是不是就是我们这个原文件的一个名字呀。
06:12
也就是说啊,咱们写的这个DEMO的这个资金码对应的是一个类,这个类呢,声明在这个demo.java这个文件当中,所以这块呢,指明的就是咱们的叫呃源码文件的一个名称。哎,源码文件的一个名称啊,名称的一个索引嘛,是吧,还是去常量池里边找的行,那么至此的话呢,咱们就把最后的这个source file这个属性呢,就解读完了,同样的大家你是在我们idea中也好,还是在我们这个Jack lab这样一个客户端这块也好,都能看到关于这个south file它的一个描述,那这块的都有买的这个值使终是二对吧,然后它的index呢,指明的就是我们当前这个源码文件demo.java好,那么至此咱们就把咱们整个这个class文件结构的这样的几个部分呢,就给大家呢,都整体介绍完了,其中呢,从重要性上来讲,我们说常量池是最为重要的,因为咱们看到了相关的下边这个5678是不是都要引用我们这个常量池量,而且常量池它自己是不是还有自己的一个引用。
07:13
啊,这要注意,常量池是我们说最重要的一个部分,然后在我们真正把它通过Java这个指令。哎,把这个指令我们加载到内存中之后呢,这个常量池它就会存放在叫运行时常量池当中,当然了,其中特别的那个字符串呢,我们会放在字符串常量池当中。啊,周串长量值当中,OK,行,那这呢,就是我们说的整体的这样的一个结构,大家呢,把这个前后的顺序,这个事呢给他记一下,咱们前面也说过,把这个事儿记一下。
我来说两句