Android开发经验谈Java技术升华JVM和并发编程

Java | 请概述一下 Class 文件的结构

2020-08-02  本文已影响0人  彭旭锐

前言

延伸文章

目录


1. 什么是 Class 文件?

# 咬文嚼字 #

虽然字节码不一定是以 “磁盘文件” 的形式存在,但是通常在很多文献 & 资料中会笼统地将字节码表述为Class 文件,这里不必钻牛角尖。

更多信息请务必阅读:《Java | 为什么 Java 实现了平台无关性》


2. Class 文件的大致结构


下面,我将概括表中各个重点数据项的具体含义!

3. 常量池(const pool)

符号引用(Symbolic References)是一个字符串类型的字面量(存储在常量池),它的作用是唯一地标示一个实体,最重要的特点如下:

常量池表结构有一个共同的特点,就是表结构的首元素是u1的标志位,代表当前的常量类型,截止到Java 13总共有 20 种常量:

常量类型 —— 引用自《深入理解Java虚拟机》

4. 本类索引 & 父类索引 & 接口索引集

这三个索引值均指向常量池中CONSTANT_Class_info常量,而CONSTANT_Class_info常量本质上也是一个索引值,指向CONSTANT_Utf8_info常量。经过 2次 索引,这三个索引最终指向对应 类 / 接口的全限定名

2 次索引后指向全限定名 —— 引用自《深入理解Java虚拟机》

5. 字段表(field_info)

字段表用于描述类字段与实例字段,但只包括在本类中声明的字段,既不包括父类中声明的字段,也不包括方法内部声明的局部变量。要注意的是,编译器生成的字段是包括的,例如编译器会为非静态内部类添加外部类的引用字段。字段表的基本结构如下:

字段表的基本结构

6. 方法表(method_info)

方法表和字段表的设计是很相似的。方法表用于描述类方法与实例方法,但只包括在本类中声明的方法或者重写的方法,不包括父类或父接口中声明的方法。需要注意的是,编译器生成的方法是包括的,例如类构造器<clinit>()与实例构造器<init>()。方法表的基本结构如下:

方法表的基本结构

可以看到,方法表和字段表的基本结构是完全一致的,此处不再赘述。需要特别指出的是,方法里面的代码在方法的Code属性,方法的受检异常声明在Exception属性


7. 属性表(attribute_info)

属性表的基本结构
# 你觉得呢?#

市面上你能找到的介绍虚拟机的书籍,普遍都会按顺序罗列出每种属性的信息。笔者并不是说这种方式不好,因为作为书籍的阐述方式需要考虑到读者可接受度 & 参考性的问题。但是如果以博客的阐述方式也采用同样地方式,岂非成为知识搬运工?因此,我将从不同的问题域出发,在每个问题域中介绍每种属性。

Code 属性
Exceptions 属性

LocalVariableTable 属性
LocalVariableTypeTable 属性
Signature 属性

InnerClasses 属性

8. 信息描述规则

Editting...


参考资料

推荐阅读

感谢喜欢!你的点赞是对我最大的鼓励!欢迎关注彭旭锐的简书!

上一篇 下一篇

猜你喜欢

热点阅读