通过对一个class文件的分析,基本理解了class文件结构,在这里最后再做一个总结,梳理下class文件内容。

两种结构

class文件内容如果泛化的区分可以分成两种结构:

1、字节数据:通过预先指定结构的占用字节数来存储基本的数据类型,比如class文件最开始的几个字节按顺序存储了魔数、小版本、大版本,再比如字段结构的访问标识符,都是通过提前确定了结构所占用的字节数,根据占用的字节来存储数据;

2、表:表是由字节数据和其他的表结构组合而成,比如整个class文件就可以当成一个表结构,它是由常量池数据这种基本结构和常量池、方法结构等表结构组成;

表结构还有一种特殊结构,可以看成一个数组结构,比如常量池结构就是一种由多种常量池类型组成的数组结构,比如方法结构也是一个数组结构,一个类中有多个方法,方法结构就是多个方法组成的结构;

每一个数组结构的出现必定会出现数组长度,它属于字节数据,用来表述接下来出现的数组结构的长度;

再看class结构

class原结构如下图:

用两种结构来展示表达class结构如下图:

用这种方式来表达class文件结构感觉更加清晰,class中包含的信息如下魔数、小版本、大版本、常量池、访问标注、当前类、父类、接口、字段、方法、属性。这样一看一个class文件仅仅表达这些信息,其中常量池、接口、字段、方法数组结构。

再看常量池

常量池也是一个常量池数组,主要由以下表结构组成:

常量池表结构也分为两种结构,存储字符串的基础结构、由多个指向基础结构常量池数组索引的组合结构,所有常量池表第一个字节tag是用来确定结构类型,根据表类型来判断接下来字节是存储还是指向。

常量池相当于class文件的资源库,存储了后面字段、接口、方法等需要的字符串,后面结构使用只需要指向常量池索引。

字段、方法、属性

方法与字段结构如下图:

字段与方法的结构完全相似,他们最主要的区别在于attributes,方法的属性包含CodeLineNumberTable、LocalVariableTable等属性结构,用来表达方法的执行过程、对应源码行号、本地变量等比字段需要更多的属性来表达。

attribute种类巨多,并且还会持续的扩展,就不能仅仅像常量池那样通过固定字节来区分到底是那种attribute,而是通过attribute_name_index指向常量池中存储的具体名称,再通过attribute_length来确定attribute所占的位数。attribute是class文件中最灵活多变的结构,同时它的使用也存在class、方法、字段等结构中。

总结

字节数据就像是基础数据,而表结构则是组合结构,而class文件通过这两种结构实现层层递进,完整的存储了需要表达的内容,使得JVM拿到class文件能够通过确定的结构进行层层解释,这样既精简了class文件内容也使JVM能快速、准确的加载class文件。

通过学习class字节码,能够学习到一些平时很难了解到的知识,比如一个类支持的最大字段、方法数量,一个方法最长有多长等。不过学习到最重要的是JVM对数据的处理方式,class是如何通过最少的内容表达出完整的信息的方式!

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

class ts 扩展方法_一个class文件到底包含了哪些东西?相关推荐

  1. class ts 扩展方法_ts类型声明文件的正确使用姿势

    ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...

  2. class ts 扩展方法_一些让程序保持可扩展的 TypeScript 技巧

    我们使用 TypeScript 的理由是,它有助于开发更快更安全的 app. TypeScript 默认会做很多简化,这有助于开发者更容易的上手,但从长远来看,这些简化也会浪费不少的开发时间. 我们收 ...

  3. class ts 扩展方法_如使用Typescript撸Vue(Vue2 + TS +TSX+CSS module)

    Vue对TS的支持一致不太好,连Vue作者尤大也自嘲真香压错了宝.期待Vue3.0会用TS重构且会有较大改进.不过目前有一些第三方的库可以曲线优化对TS的支持.主要就介绍下过下面两个库来写Vue. 总 ...

  4. 如何在另一个JavaScript文件中包含一个JavaScript文件?

    JavaScript中是否有类似于CSS中@import的内容,可让您在另一个JavaScript文件中包含一个JavaScript文件? #1楼 而不是在运行时添加,而是使用脚本在上传之前进行串联. ...

  5. 是否可以在另一个CSS文件中包含一个?

    是否可以在另一个CSS文件中包含一个? #1楼 是的,可以使用@import并提供css文件的路径,例如 @import url("mycssfile.css"); 要么 @imp ...

  6. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  7. class ts 扩展方法_JUnit 5自定义扩展

    前言 在org.junit.jupiter.api.extension包下,JUnit5提供了丰富的扩展接口,通过实现这些接口,我们可以定制自己的扩展并注册到JUnit中来实现功能扩展. Extens ...

  8. 一个java类可以有_一个.java文件中可以有几个同级类?

    1.在一个.java文件中可以有多个同级类(和public一样的位置,注意不是内部类).其修饰符只可以public/abstract/final/和无修饰符,不能是其他的protected/priva ...

  9. C#.Net工作笔记010---c#中的静态扩展方法_可动态给string等_添加共通方法好用

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 之前,给list添加排序的扩展方法的时候用过.下面的作用是去掉list中重复的数据. /// &l ...

最新文章

  1. CentOS6:安装JDK
  2. Spring MVC集成slf4j-logback - 我想跟代码谈谈 - 博客频道 - CSDN.NET
  3. 周立波贼经典的话1-10
  4. 一些SqlServer常见和入门操作
  5. 单点系统架构的可用性与性能优化
  6. 【速看,双100%】剑指 Offer 14- I. 剪绳子 I
  7. 功能强大的国外商业PHP在线教育系统LMS源码/直播课程系统
  8. Character,String相关方法,Int,double互相转换
  9. 【榜首团队专访】冲刺复赛,他们有绝招
  10. 记录一次配置unix网络编程环境的过程和遇到的问题
  11. 学生时代的最后一个新年,请一定要做这五件事
  12. 奇迹Mu分析 - 各种主流BT功能实现
  13. 密码学--CTF Crypto
  14. android 视频解决方案,短视频SDK升级为短视频解决方案
  15. 从CTF比赛真题中学习压缩包伪加密与图片隐写术【文中工具已打包】
  16. 多项式的余数定理及其应用
  17. 基于Stm32f103硬件iic驱动LM75A温度传感器
  18. R和RStudio及库文件的安装教程
  19. libpng warning: iCCP: known incorrect sRGB profile 警告解决
  20. 46岁新晋院士:我上研究生时,卸载了所有游戏

热门文章

  1. 深度学习福利入门到精通第五讲——ResNet模型
  2. 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼
  3. vscode代码提示只显示一行_模型秒变API只需一行代码,支持TensorFlow等框架
  4. 桶排序JAVA软件测试_111-堆排序的速度测试和小结
  5. Tiktok才是跨境卖家的未来?
  6. scikit-klearn之 1.决策树
  7. 「镁客早报」第九城市与法拉第未来成立合资公司,出资6亿美元;华为获得韩国运营商5G订单,占比95%... 1
  8. Educational Codeforces Round 57 (Rated for Div. 2)
  9. 【十一】Jmeter 函数助手实战:__time 时间戳函数
  10. flask ajax json html,后端后,渲染模板通过Flask中的Ajax从前端接收JSON