>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 18534 个阅读者 刷新本主题
 * 贴子主题:  解密Java类文件的数据结构 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2022-10-20 05:11:55     消息  查看  搜索  好友  邮件  复制  引用

本文介绍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;
}

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

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()函数等,在后面涉及相关知识点时将详细介绍这些方法的实现。 


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->泛型
  JavaWeb开发-->JavaWeb应用入门(Ⅰ)
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->Socket用法详解
  精通Spring-->Vue简介
  Vue3开发-->绑定CSS样式
  Java设计模式: 单一职责原则和依赖倒置原则详解
  BST 二叉搜索树
  关于新书
  请求大佬们的帮助
  Java并发编程之验证volatile不能保证原子性
  Java并发之volatile关键字内存可见性问题
  使用javaNIO实现C/S模式的通信
  Eclipse使用指南:工作空间(Workspace)
  Java入门实用代码:获取本机IP地址及主机名
  Java入门实用代码:集合转数组
  Java入门实用代码:自定义异常
  Java入门实用代码:向文件写入字符串
  Java入门实用代码:字符串优化测试
  Java入门实用代码:删除一个文件目录
  类加载中的双亲委派模型
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 kericnnoe 
威望: 未知
级别: 未知
魅力: 未知
经验: 未知
现金: 未知
发文章数: 未知
注册时间: 未知
 复制  引用


線上博弈資訊站的玩家喜歡比較喜歡有根據的下注技巧
发文章时间 2022-12-06 01:53:07
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。