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

声明:

Author:赵志乾

Date:2018-6-22

Declaration:All Right Reserved!!!



背景知识:

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

    在Java应用中,其通过将数据拆分到不同的类型中,每一种类型都是数据的一种隐藏域。在一个特定的隐藏域中,其会根据内部数据的使用场景再次进行划分,从而提升应用本身的性能,如当某些数据在该类型中只能或只需存在一份时,会将其划分到类级别,而当某些数据在该类型中必须依附实例而存在时,会将其划分到实例级别。于是便出现了类级别数据和实例级别数据,对应的专业术语分别为类级别字段和实例级别字段。

    位于隐藏域中的字段通常由以下信息组成:类型、名称、访问可见性、并发可见性、序列化可见性、可变性以及隐藏域中的分类。这些信息中,除类型和名称外,均由枚举含义的关键字来表征。

注:对于方法的封装及其与数据的捆绑见《方法表结构集合》。


字段表结构集合:

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

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

    3、描述符是一个给虚拟机来看的概念,所以其存放的内容看起来会很怪异(可读性差)。但其含义还是比较明确的,其中涉及的各个字符如下:


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

注:虽然子类会从父类继承字段,但子类字节码文件中的字段表结构集合是不包含父类或父接口中所定义的字段,因为此时是静态文件,还没有进行真正的链接。即在虚拟机加载类的过程中,会实现子类和父类间真正的继承。


邮箱:[email protected]

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

猜你喜欢

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