类文件介绍

类文件介绍

之前在介绍类的双亲委派机制时,多次涉及到对ClassFileParser类中的parseClassFile()的调用。因为类的装载不仅仅是找到类对应的Class文件二进制流,更要解析出Class文件中包含的信息,将其转换为C/C++表示方式,这样虚拟机在运行过程中才能更方便的进行操作。

在介绍parseClassFile()方法之前,先认识一下Java虚拟机规范定义的Class文件格式及ClassFileParse类中定义的一些重要属性。

类文件的格式如下:

ClassFile {
    u4             magic;

    u2             minor_version;
    u2             major_version;

    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];

    u2             access_flags;
    u2             this_class;
    u2             super_class;

    u2             interfaces_count;
    u2             interfaces[interfaces_count];

    u2             fields_count;
    field_info     fields[fields_count];

    u2             methods_count;
    method_info    methods[methods_count];

    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

这个相对简单,目前说明这个格式的参考资料也比较多,这里不做过多介绍。 

HotSpot定义了ClassFileParser类来辅助读取及保存类解析的相关信息,类及重要属性的定义如下:

源代码位置:src/share/vm/classfile/classLoader.hpp
class ClassFileParser VALUE_OBJ_CLASS_SPEC {
 private:
  u2        _major_version;
  u2        _minor_version;
  Symbol*   _class_name;
  ClassLoaderData*         _loader_data;
  KlassHandle              _host_klass;
  GrowableArray<Handle>*   _cp_patches; // overrides for CP entries


  // class attributes parsed before the instance klass is created:
  bool        _synthetic_flag;
  int         _sde_length;
  char*       _sde_buffer;
  u2          _sourcefile_index;
  u2          _generic_signature_index;

  // Metadata created before the instance klass is created.  Must be deallocated
  // if not transferred to the InstanceKlass upon successful class loading
  // in which case these pointers have been set to NULL.
  instanceKlassHandle _super_klass;
  ConstantPool*    _cp;
  Array<u2>*       _fields;
  Array<Method*>*  _methods;
  Array<u2>*       _inner_classes;
  Array<Klass*>*   _local_interfaces;
  Array<Klass*>*   _transitive_interfaces;
  // ...
  InstanceKlass*   _klass;  // InstanceKlass once created.
  …
  ClassFileStream* _stream;              // Actual input stream
  ...
}

类中的属性通过名称就可以知道存储的相关信息,其中最主要的就是通过_cp保存常量池信息、通过_fields保存域信息、通过_methods保存方法、通过_klass保存类相关的信息。通过_stream属性可以方便地读取流的信息,在下一篇将详细介绍。

类还定义了许多重要的函数,例如解析常量池的parse_constant_pool()与parse_constant_pool_entries()函数、解析方法的parse_methods()函数、解析字段的parse_fields()函数等,在后面涉及相关知识点时将详细介绍这些方法的实现。 

相关文章的链接如下:

1、在Ubuntu 16.04上编译OpenJDK8的源代码 

2、调试HotSpot源代码

3、HotSpot项目结构 

4、HotSpot的启动过程 

5、HotSpot二分模型(1)

6、HotSpot的类模型(2)  

7、HotSpot的类模型(3) 

8、HotSpot的类模型(4)

9、HotSpot的对象模型(5)  

10、HotSpot的对象模型(6) 

11、操作句柄Handle(7)

12、句柄Handle的释放(8)

13、类加载器 

14、类的双亲委派机制 

15、核心类的预装载

16、Java主类的装载  

17、触发类的装载  

作者持续维护的个人博客classloading.com

关注公众号,有HotSpot源码剖析系列文章!

<span>类文件介绍</span>   

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 4.4.2分类模型评判指标(一) – 混淆矩阵(Confusion Matrix)

    4.4.2分类模型评判指标(一) – 混淆矩阵(Confusion Matrix)简介混淆矩阵是ROC曲线绘制的基础,同时它也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。一句话解释版本:混淆矩阵就是分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示出来。这个表就是混淆矩阵。数据分析与挖掘体系位置混淆矩阵是评判模型结果的指标,属于模型评估的一部分。此外,混淆矩阵多用于判断分类器(Classifier)的优劣,适用于…

    2022年5月14日
    54
  • Django(20)ORM模型迁移命令

    Django(20)ORM模型迁移命令迁移命令makemigrations:将模型生成迁移脚本。模型所在的app,必须放在settings.py中的INSTALLED_APPS中。这个命令有以下几个常用选项:app_label:后面可

    2022年7月30日
    5
  • 量化投资资源

    量化投资资源有些国外的平台、社区、博客如果连接无法打开,那说明可能需要“科学”上网1、量化交易平台国内在线量化平台:BigQuant-你的人工智能量化平台-可以无门槛地使用机器学习、人工智能开发量化策略,基于python,提供策略自动生成器镭矿-基于量化回测平台果仁网-回测量化平台京东量化-算法交易和量化回测平台聚宽-量化回测平台优矿-通联量化实验室Ricequ…

    2022年7月21日
    31
  • Landsat系列卫星介绍

    Landsat系列卫星介绍美国陆地卫星(Landsat)系列卫星是由美国航空航天局(NASA)和美国地质调查局(USGS)共同管理的。自1972年,Landsat卫星陆续发射,是美国用来探测地球资源与环境的系列地球观测卫星系统,曾称为地球资源技术卫星(ERTS)。现在中国科学院遥感与数字地球研究所主要接受、处理、存档和分发美国陆地卫星系列中的Landsat-5、Landsat-7和Landsat-8三颗卫星的数据。1.Landsat1Landsat-1卫星是美国陆地卫星的第一颗卫星,原名ETRS…

    2022年7月23日
    15
  • linux查看内核版本_ubuntu查看内核版本号

    linux查看内核版本_ubuntu查看内核版本号文章目录前言一、使用`uname`命令查看二、使用`hostnamectl`命令查看三、通过查看`/proc/version`文件确认四、使用`/etc/issue`查看五、使用`lsb_release-a`查看前言以Ubuntu为例,介绍几个用来查看系统与内核版本的命令,拿起小本本记录下来!镜像下载地址:https://mirrors.tuna.tsinghua.edu.cn/一、使用uname命令查看uname命令显示多个系统信息,包括Linux内核体系结构,名称版本和

    2022年10月13日
    5
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座[通俗易懂]

    ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座

    2022年2月17日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号