[java虚拟机]--(2)字节码文件--(7)方法表结构集合

声明:

Author:赵志乾

Date:2018-6-22

Declaration:All Right Reserved!!!



背景知识:

    面向对象编程思想倡导我们将数据和方法进行捆绑封装,使得特定数据只能被特定方法访问,从而避免某些方法误操作数据,并可缩小问题点的定位范围。当然,这只是一种设计理念,需要有具体的设施来支撑该理念的落地。

    在Java应用中,伴随着数据的拆分,操作数据的方法也进行了对应的拆分:类方法和实例方法。其中类方法只能操纵该类的类字段和类方法,因为实例字段依附于实例而存在,类方法无法知晓其操作的是哪个实例。而类方法不能调用实例方法则是由于实例方法在编译生成字节码的过程中,编译器为其加入了一个隐式参数this,该参数引用其所依附的实例。

    当然,“实例方法依附于实例”的说法其实并不准确,因为实例方法是一份,实例本身可以有多份。两者之间通过实例方法的隐式参数而捆绑在一起。

    由于方法也是位于类型的隐藏域中,其信息和字段不同,主要包括:名称、返回值类型、参数列表、逻辑代码、访问可见性、并发安全性、是否被实现以及是否为本地化方法。其中除名称、返回类型、参数列表和逻辑代码外,均由枚举含义的关键字来表征。

注:数据的封装见《字段表结构集合


方法表结构集合:

    1、一个隐藏域中不止一个方法,所以字节码文件中使用一个表结构来存放。由于方法本身的信息也比较复杂,也使用表结构来存放,于是便出现了方法表结构集合。其中每一项都对应一个方法,称作方法表结构。

    2、方法本身的信息在Java代码中分为两大类,见“背景知识”。其中,具有枚举含义的关键字对应到方法表结构中,可用一个标志的某一位进行标识。而名称和类型(返回值类型和参数类型)则分别由名称索引和描述符索引来表征。名称索引和描述索引指向的是常量池中的项。逻辑代码及其他信息,则均由方法表结构的属性表来表征。

    3、方法的描述符同字段的描述符类似,也有主要有以下的符号构成。由于方法包含返回值类型和参数列表,两者均放在描述符中表示,所以需要对其进行定界标识。格式为:参数列表类型在前,返回值类型在后,且参数列表类型由圆括号包裹。


注:除了上表中的这些字符外,描述符中还会有一个特殊的字符“[”,用于表示数组。数组的维数用"["的个数来表征。

    4、方法描述符示例:int sum(int a,int b); 描述符为:"(II)I"。

注:由于描述符中的类型和类型之间没有分隔符,所以在连续出现全限定名时会无法定界,于是规定每个全限定名以分号结束。

注:虽然子类会从父类继承方法,但子类字节码文件中并不包含从父类中继承下来的方法(重载除外)。因为此时是静态文件,还没有进行真正的链接。即在虚拟机加载类的过程中,会实现子类和父类间真正的继承。


邮箱:[email protected]

参考资料:《深入理解java虚拟机》--周志明


猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/80779801
今日推荐