深入理解Java虚拟机(类文件结构+类加载机制+字(3)

因为 volatile 关键字和 transient 关键字不能修饰方法,所以方法表的访问标志中没有 ACC_VOLATILE 和 ACC_TRANSIENT。与之相对的,synchronizes、native、strictfp 和 abstract 关键字可以修饰方法,所以方法表的访问标志中增加了 ACC_SYNCHRONIZED、ACC_NATIVE、ACC_STRICTFP 和 ACC_ABSTRACT 标志。

对于方法里的代码,经过编译器编译成字节码指��后,存放在方法属性表中一个名为「Code」的属性里面。

2.7 属性表集合

在 Class 文件、字段表、方法表中都可以携带自己的属性表(attribute_info)集合,用于描述某些场景专有的信息。

属性表集合不像 Class 文件中的其它数据项要求这么严格,不强制要求各属性表的顺序,并且只要不与已有属性名重复,任何人实现的编译器都可以向属性表中写入自己定义的属性信息,Java 虚拟机在运行时会略掉它不认识的属性。

写在最后

为了控制篇幅,这篇文章里丢弃了很多细节,比如常量池的项目类型、方法表、属性表的具体内容等等。建议想要深入了解的同学可以自己动手将 Java 类编译成二进制字节码文件,根据文章里介绍的类文件结构逐个字符去对照和实验,有助于加深理解。

关于「类文件结构」我们就介绍到这里,下一篇我们来聊聊「虚拟机的类加载机制」。

参考资料:

《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 2 版)》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/95fecc785a4c846ec5c4610a9ca23f10.html