00:00
接着呀,咱们来看一下这个class文件的这个结构,那首先呢,我们上来就有一句这样的话,说class文件的这个结构啊,并不是一成不变的,随着呢,Java虚拟机的不断发展,总是不可避免的啊对class文件结构呢,做出一些调整,但是呢,其基本结构和框架呢,是非常稳定的,也就是我们下边呢要说的这样的一个结构,诶什么意思呢?就是咱们说这个Java虚拟规范,咱们刚才那块不也看到了是吧?诶再往上推一下,诶有不同的JP版本对应的Java虚拟规范呢,也稍有不同,但是基本上哎,大家呢,针对于这个大的class的这个结构。啊是基本上是不变的,哎,可能有一些细节啊,包括一些指令呢,会有一些添加啊,减少啊,哎这样的,但是整体的这个结构,诶,Class文件的这个结构是不变的,这个咱们刚才也提到了,说整个这个class呢,其实就相当于也是一个表是吧,哎,也是一个表包含的呢,就是里边的这样的几个部分。哎,里边这样几个部分,那咱们在一开始讲这个class的时候也提到过,是不是有这个,诶面试题啊,这些面试题呢,是BAT的面试题啊,其实准确的说呢,这是百度的面试题啊,他就问说类文件结构有几个部分呀,是吧?诶那其实呢,就是对应的我们官方里边这样的一个表格。
01:16
哎,就是这样的一个表格啊,大家看这可以或者的话呢,你看我们这个课件里边啊,把它的诶把这个打开。那对应的这个中文的话呢,描述就是它那有的人可能会发现,哎,感觉人家这块写的多,你这写的少啊是吧?啊那你再看这块儿呢,这块写的还多呢,所以你要是这,呃就这两个呢,是严格匹配的啊呃这个多少主要是差到哪了,是因为我这呢,像这个字段表集合,我就把它合一起的啊那咱们顺便呢,就稍微解读一下。这个大家看着是不是这块字稍微的有点小是吧,哎,我们可以这样一下啊。这个可能稍微的能打一点啊,哎,回过来咱们呢,匹配一下这个魔术啊,我们稍微的做一个简单的一个介绍啊,接下来咱们是一个一个的深入进去去讲,那大家呢,先熟悉一下,首先呢,我们这个最起码文件当中上来呢,有一个概念叫做魔术啊,叫做magic或者叫magic number都可以,因此呢,刚才我们提到叫无号数,用四个字节呢来表示一个叫魔术,这个其实主要对应的就是我们识别你当前这个文件啊,得是一个class文件啊这样的一个标识,然后下边呢,是我们class文件的这个版本。
02:24
啊,就是你当前你这个自解码文件是在哪一个版本下呃进行的一个编译是吧,这个版本呢,又分成了叫呃,Minor啊version和major啊version就是副版本,主版本或者叫小版本大版本,哎这个呢,其实对应的这是俩,哎在我这就合成一个了啊,然后在下边呢,叫做常量池,这个常量池啊是咱们解析这个司基码文件比较重的一个部分啊,花的精力呢比较多啊,这个常量池呢,这里边儿大家会发现,你看是不是就有两部分啊。咱们刚才讲到了,说你要是个表的话呢,由于呢,我们表长度呢,咱们没有那个分隔符嘛,所以你得先告诉我你这个表得多长,哎,上边呢,不就是先通过一个两个字节的啊,无号数呢,告诉你说常量值多长,然后下边呢,就是你对应的这个数组吗。
03:13
对吧?哎,这里边要注意一下,比如这个常量的长度是十,那其实这个数组的长度呢,注意是九啊,因为呢首,所以那个零呢,咱们没有分配啊,这个是一个小细节,咱们讲到这的时候呢,还在说啊,再往下的话呢,叫访问标识或者访问标志啊都可以,这个对应的呢,就是我们这里边啊,这个U2啊叫做X access flex,就是你当前这个,比如说是个类吧。啊,比如说咱们刚才那个,呃叫什么叫DEMO是吧?啊这样的一个类啊,你这个类呢,是一个类吗?还是一个接口呢?呃,你的权限是什么呀,有没有像abstract这个final修饰呢?哎,所以这呢,主要通过这个访问标志啊来体现啊这是它,然后再接下来呢,叫类索引,负类索引接口索引集合,哎一可以来说啊类索引就指明你当前这个类是叫什么名啊哎,你的父类是叫什么名啊对吧?哎,Super class。
04:08
然后下边这个接口索引,因为我们知道啊,一个类的负类呢,直接负类只有一个,所以这时候呢,这不是一个表了,然后但是你这个接口的话呢,是可以实现多个接口的,所以接口这块呢,你要实现的接口就可能又是一个数组了嘛,哎,这里边我们就有个数组来表示,哎,咱们这叫表来表示的是吧?那既然你是个表的话呢,是不是还得先告诉我这个长度啊OK,这呢就对应的我们这个叫UR啊,Interface count,然后呢,这个UR就是你这个诶表,那这个接口的这个表是吧?哎,这两项来表示的。在接口这块啊,好,然后再往下的话呢,叫字段表集合,这个呢,就是我们说的那个叫F的属性嘛,咱们平时叫属性,但是准确的来讲呢,叫字段是吧,因为属性我们还有特殊的这个呃含义啊叫字段,叫这个属性呢,这个字段呢,就是我们平时所说的叫属性,英文呢叫field,由于呢,我们在一个类当中啊,是不是你可以定义多个这个字段啊。
05:02
那进而的话呢,它也是一张表,那你也得先告诉我长度是多少,哎,这呢是对应的我们这个叫属性的信息,然后再下边呢,就是你当前这个类中定义的这个方法。哎,方法这块呢,你看是不是有一个方法表啊,那方法表呢,前提也得先告诉我方法的这个哎表的长度是多少,所以有一个哎methods count啊没问题,那对于一个类来讲呢,咱们说最起码你是不是得有一个呃像这一个呃in是吧,这样的一个实例化的这样的一个构造体方法。啊,当然你还可以自己再去定义方法啊,当然还有一个关于类初始化的时候,还有一个c Le内这样的一个方法啊,这个咱们后边再提啊,嗯,属性表集合这个属性表的话呢,在咱们直接码文件当中,它有特殊的含义啊,属性翻译过来叫attribute啊,其实咱们一开始中文翻译这个field的时候,翻译的不是特别好啊,导致现在呢,大家在日常的教学当中经常说这个类中几个属性啊呃,指的是实际上是这个字段对吧?我们这个属性呢,其实有具体的含义的啊,Contribute这个属性呢,比如说表,诶,你当前这个类名啊这样的一些情况啊,这个咱们后边呢,也会说,包括方法里边,诶我们这个像使用这个来查看的时候呢,方法里边不都有这个叫code嘛,哎,这呢,其实也都是它里边的一个属性啊,这个line number table啊,啊local variable table啊等等,哎这呢,其实都是一些属性信息啊。
06:23
好,那刚才呢,咱们对整个这个大的class文件整体结构呢进行了一个说明,呃,你发现这边多这边少,哎,主要原因是因为我这里边写的呢,其实包含了对应这边呢,可能是两项对吧?诶是这样的一个情况啊,那一提到这个集合呢,其实里边就涉及到它这个表结构了,前面呢得先有一个数量。啊是这样子的,那对应的这个中文的这块,我也做了一个这样的一个结构啊,这个结构呢是嗯,对,这也是我课件里边做出来的啊,就是画就这一张呢,做这些图啊就非常的麻烦一些,呃,大家可以看这个啊,也都作为课件呢发给大家啊,就是一个一个填进去之后啊,截了一张图啊放到这儿了。
07:03
哎,看这个也可以啊,对应的这里边这个大小长度数量啊,这块都有标识啊就OK了啊行,那下边呢,我们啊这块写了图就开始要装逼了是吧?哎,这个主要呢,就是咱们要一点点开始去读了。嗯,这个大家呢,做好心理准备啊,这个把整个我们现在看到的这一部分。这一部分是吧,一点点切割,切割成咱们刚才给大家看到的这个class文件的这几部分,这个结构啊,这几部分结构在咱们分析完之后呢,从前往后大概都有什么,先后顺序是什么,大家也需要稍微的记一记。咱不是也看到面试期里边问到这个事儿了,是吧?啊这个解读呢,实际上是比较崩溃的,咱们接下来呢,大家呢,哎,跟着我一起咱们做一个解读啊,因为日后呢,基本上大家没有什么动力呢,哎去一点点去翻译了啊为啥呢?因为是不是都给你翻译好了,哎直接你看这个就行是吧?啊那从那个呃,最原始的角度来讲,咱们带着大家呢,走一遍啊。
我来说两句