00:00
那接着呀,咱们来看一下方法表集合,方法表集合呀,跟咱们前面提到的这个字段表集合呀,其实在设计上呢,基本上这个套路是一样子的,那也包括呢,计数器也包括呢,具体的字段表或者方法表,只不过呢,关于字段表方法表他们这个描述符会稍微有一些区别。啊好,那我们来看一下具体的关于方法表集合的一个说明,Methods,对吧,它呢是指向常量值索引的集合,完整的描述了每个方法的签名。在最起码文件当中,每一个method infer就是我们每一个方法,每一个方法呢,都对应着一个类或者接口中的方法信息。比如说呢,我们这个ma in里边记录了你当前方法的修饰符,对吧,你方法的这个修饰符,这我们都称为access flex里边的信息包括呢,我们这个方法的描述符,里边涉及到了反位值类型方法的参数信息等等,这呢,我们都是要叫做这个叫描述符。嗯,如果这个方法呢,不是抽象的,或者不是native的,那么自解码中都会体现出来,这个稍微注意一下这个事儿,那接着我们再来看一下这个事儿,说一方面啊,这个method表中只描述了当前类或者是接口当中声明的方法。
01:15
那不包括呢,从负类或者负接口中继承过来的方法,跟我们这个属性呢,其实是一样子的,对吧?属性呢也是这样子,不包括从负类中继承过来的,那另外一方面呢,这个methods呢,表当中它也有可能会出现由编译器自动添加的一些方法。我们提到字段的时候呢,也说过这个问题,就是说我们可能是内部类呢,要访问外部类的话呢,我们加入一些对外部类的访问的这个字段,对吧?那方法这块的话呢,我们也会去添加编译器自动添加的方法,这里边呢主要提到了有两个方法,这也是我们这个讲类初始化的时候呢,非常重要的两个方法,一个呢是类或者叫接口初始化方法c in和实例,就我们涉及到创建对象的时候,构造器为主要代表组成的一个叫实例化方法in OK,这个咱们在后边讲这个类的加载的时候呢,还会再提到这样两个结构。
02:04
行这呢,我们就清楚这个事儿这块呢,这个注意事项,在我们讲这个字段的时候呢,其实也提到过这样一个问题。大家来看一下是什么事,就是在咱那个扎在咱那个Java语言当中说我们要是重载一个方法的话,重载一个方法的话呢,咱们要求这两个方法呢,方法名得是一样的,对吧?有简单的方法名称,但是呢,他们必须彼此相同方法名的这个方法之间啊,他们的这个什么呀,各个参数必须是不一样子的。对吧,对吧,他们各个参数呢,必须是不一样子的,然后跟他们这个返回值是没有任何关系的,就是在返回值这一块呢,它是不会包含在叫特征签名当中。就是我们要保证呢,这个重载的方法呢,这个特征签名呢,是不一样子的,这个特征签证名里边,我们主要关心的就是各个参数,包括参数的这个类型啊,参数的个数啊,对吧,它得是不一样子的,我们这个特征签名里边不包含反应类型,跟它没关系。
03:03
这个事儿的话呢,大家应该都很清楚,对吧,就是我们说的这样一个问题,比如说呢,我们放到咱们放到前边这个吧,比如以这个嗯,Sun这个我们就别动,在这个string里边,比如我们写一个吧,在这一类当中,我们假设定义一个方法public word叫METHOD1,这呢是一个方法,方法体我就具体不写了,然后另外又定一个方法,这叫word叫method,也叫一,方法名必须一样,然后这个参数呢不一样,我们认为这两个方法就构成了重载,和我们这个返回值类型这块呢是没有关系的,就好比是我们现在定义一个这样的一个方法,我这儿呢,RETURN1,此时呢,这两个方法是不可以同时出现的。就是因为呢,我们认为你这个特征签名里边,咱们只包含这个参数的信息,没有含着这个返回值类型这块,那只看这个特征签名的话呢,它俩一样,所以呢就不允许同时存在。这是咱们Java语言的一个规定,对吧?那么回过来我们再来看一下关于咱们说的这个class文件,这个class文件当中的这个特征签名的范围呢,就要更大一些,就是说我们讲这个方法表当中的时候呢,是不是也有可能会涉及到多个不同的这个方法的情况,对吧?这个多个不同方法呢,我们彼此之间不一样,这个时候呢,它的特征签名的范围就会更大一些。
04:20
方法名比如说一样了,那剩下的这个特征签名呢,它会考虑比如说你这个参数。或者返回值类型只要不一样的话呢,我们都认为这个特征签名是不一样子的。也就是这样说,尽管Java语法规范并不允许在一个类或者是接口当中声明多个方法签名相同的方法,但是呢,和章法语法规范相反的是,资金码文件中恰恰应用存放多个方法签名相同的方法,那唯一的条件就是这些方法的返回值呢?它不能一样。有这样的一个区分,对吧,咱们在刚才讲到这个字段的时候呢,不也提到类似这样的一个概念吗?在字段的时候呢,我们说在一个类中不允许定义两个相同字段名的这个。
05:05
在这在在在哪呢。这个字段没法重载,不能定义两个相同这个名的这个字段,对吧,但是在咱们这个。嗯,直接码文件当中,我们只要呢,这个修饰符啊,或者是类型不一样的,我们是允许这个定义两个相同名字的这个字段的,嗯,这个大家整体上了解一下这个事情就可以了,好,那关于我们这个方法表集合,既然呢是一个表了,在它上面呢,之前也得这个提供一个计数器,只要是计数器呢,它的长度呢,就是两个字节,大家记住我们方法表中这个。方法的这个个数对吧,好,那回到咱们这个DEMO。当中咱们这儿呢,上来就是一个方法表,计数器这个呢是二,那就表示我们当前这个DEMO,这个自解码文件当中呢,一共是有两个方法。对吧,一共是两个方法,那咱们这块呢,给大家做一个记录,我用一下这个颜色。
06:04
我们称为呢叫哎方法表计数器。或者叫这个方法计数器可以啊,那有两个方法,那接下来的话呢,我们就对这两个方法呢,依次做一个解读,大家会发现呢,我这个表里边我加了两个这个红色的这个标识,那红色标识呢,其实就对应着我们这里边儿的两个方法,第一个方法呢,就从这个零零开始,一直到我们这个零零结束,第二个方法呢,是从这个零零开始,到这个零零结束,会发现呢,我们关于方法这块描述信息也很多。那为什么会这样呢?因为里边涉及到了我们这个具体的方法内部的执行代码了,那执行代码的话呢,会有这个具体的操作的资金码指令是吧,所以这里边儿是蕴含着自解码指令了,所以会显得这个这个数据量呢会稍微偏大一些。好。
我来说两句