class ts 扩展方法_一个class文件到底包含了哪些东西?
![](/assets/blank.gif)
通过对一个class文件的分析,基本理解了class文件结构,在这里最后再做一个总结,梳理下class文件内容。
两种结构
class文件内容如果泛化的区分可以分成两种结构:
1、字节数据:通过预先指定结构的占用字节数来存储基本的数据类型,比如class文件最开始的几个字节按顺序存储了魔数、小版本、大版本,再比如字段结构的访问标识符,都是通过提前确定了结构所占用的字节数,根据占用的字节来存储数据;
2、表:表是由字节数据和其他的表结构组合而成,比如整个class文件就可以当成一个表结构,它是由常量池数据这种基本结构和常量池、方法结构等表结构组成;
表结构还有一种特殊结构,可以看成一个数组结构,比如常量池结构就是一种由多种常量池类型组成的数组结构,比如方法结构也是一个数组结构,一个类中有多个方法,方法结构就是多个方法组成的结构;
每一个数组结构的出现必定会出现数组长度,它属于字节数据,用来表述接下来出现的数组结构的长度;
再看class结构
class原结构如下图:
![](/assets/blank.gif)
用两种结构来展示表达class结构如下图:
![](/assets/blank.gif)
用这种方式来表达class文件结构感觉更加清晰,class中包含的信息如下魔数、小版本、大版本、常量池、访问标注、当前类、父类、接口、字段、方法、属性。这样一看一个class文件仅仅表达这些信息,其中常量池、接口、字段、方法数组结构。
再看常量池
常量池也是一个常量池数组,主要由以下表结构组成:
![](/assets/blank.gif)
常量池表结构也分为两种结构,存储字符串的基础结构、由多个指向基础结构常量池数组索引的组合结构,所有常量池表第一个字节tag是用来确定结构类型,根据表类型来判断接下来字节是存储还是指向。
常量池相当于class文件的资源库,存储了后面字段、接口、方法等需要的字符串,后面结构使用只需要指向常量池索引。
字段、方法、属性
方法与字段结构如下图:
![](/assets/blank.gif)
字段与方法的结构完全相似,他们最主要的区别在于attributes,方法的属性包含Code、LineNumberTable、LocalVariableTable等属性结构,用来表达方法的执行过程、对应源码行号、本地变量等比字段需要更多的属性来表达。
attribute种类巨多,并且还会持续的扩展,就不能仅仅像常量池那样通过固定字节来区分到底是那种attribute,而是通过attribute_name_index指向常量池中存储的具体名称,再通过attribute_length来确定attribute所占的位数。attribute是class文件中最灵活多变的结构,同时它的使用也存在class、方法、字段等结构中。
总结
字节数据就像是基础数据,而表结构则是组合结构,而class文件通过这两种结构实现层层递进,完整的存储了需要表达的内容,使得JVM拿到class文件能够通过确定的结构进行层层解释,这样既精简了class文件内容也使JVM能快速、准确的加载class文件。
通过学习class字节码,能够学习到一些平时很难了解到的知识,比如一个类支持的最大字段、方法数量,一个方法最长有多长等。不过学习到最重要的是JVM对数据的处理方式,class是如何通过最少的内容表达出完整的信息的方式!
Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!
![](/assets/blank.gif)
class ts 扩展方法_一个class文件到底包含了哪些东西?相关推荐
- class ts 扩展方法_ts类型声明文件的正确使用姿势
ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...
- class ts 扩展方法_一些让程序保持可扩展的 TypeScript 技巧
我们使用 TypeScript 的理由是,它有助于开发更快更安全的 app. TypeScript 默认会做很多简化,这有助于开发者更容易的上手,但从长远来看,这些简化也会浪费不少的开发时间. 我们收 ...
- class ts 扩展方法_如使用Typescript撸Vue(Vue2 + TS +TSX+CSS module)
Vue对TS的支持一致不太好,连Vue作者尤大也自嘲真香压错了宝.期待Vue3.0会用TS重构且会有较大改进.不过目前有一些第三方的库可以曲线优化对TS的支持.主要就介绍下过下面两个库来写Vue. 总 ...
- 如何在另一个JavaScript文件中包含一个JavaScript文件?
JavaScript中是否有类似于CSS中@import的内容,可让您在另一个JavaScript文件中包含一个JavaScript文件? #1楼 而不是在运行时添加,而是使用脚本在上传之前进行串联. ...
- 是否可以在另一个CSS文件中包含一个?
是否可以在另一个CSS文件中包含一个? #1楼 是的,可以使用@import并提供css文件的路径,例如 @import url("mycssfile.css"); 要么 @imp ...
- Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法
public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...
- class ts 扩展方法_JUnit 5自定义扩展
前言 在org.junit.jupiter.api.extension包下,JUnit5提供了丰富的扩展接口,通过实现这些接口,我们可以定制自己的扩展并注册到JUnit中来实现功能扩展. Extens ...
- 一个java类可以有_一个.java文件中可以有几个同级类?
1.在一个.java文件中可以有多个同级类(和public一样的位置,注意不是内部类).其修饰符只可以public/abstract/final/和无修饰符,不能是其他的protected/priva ...
- C#.Net工作笔记010---c#中的静态扩展方法_可动态给string等_添加共通方法好用
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 之前,给list添加排序的扩展方法的时候用过.下面的作用是去掉list中重复的数据. /// &l ...
最新文章
- CentOS6:安装JDK
- Spring MVC集成slf4j-logback - 我想跟代码谈谈 - 博客频道 - CSDN.NET
- 周立波贼经典的话1-10
- 一些SqlServer常见和入门操作
- 单点系统架构的可用性与性能优化
- 【速看,双100%】剑指 Offer 14- I. 剪绳子 I
- 功能强大的国外商业PHP在线教育系统LMS源码/直播课程系统
- Character,String相关方法,Int,double互相转换
- 【榜首团队专访】冲刺复赛,他们有绝招
- 记录一次配置unix网络编程环境的过程和遇到的问题
- 学生时代的最后一个新年,请一定要做这五件事
- 奇迹Mu分析 - 各种主流BT功能实现
- 密码学--CTF Crypto
- android 视频解决方案,短视频SDK升级为短视频解决方案
- 从CTF比赛真题中学习压缩包伪加密与图片隐写术【文中工具已打包】
- 多项式的余数定理及其应用
- 基于Stm32f103硬件iic驱动LM75A温度传感器
- R和RStudio及库文件的安装教程
- libpng warning: iCCP: known incorrect sRGB profile 警告解决
- 46岁新晋院士:我上研究生时,卸载了所有游戏
热门文章
- 深度学习福利入门到精通第五讲——ResNet模型
- 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼
- vscode代码提示只显示一行_模型秒变API只需一行代码,支持TensorFlow等框架
- 桶排序JAVA软件测试_111-堆排序的速度测试和小结
- Tiktok才是跨境卖家的未来?
- scikit-klearn之 1.决策树
- 「镁客早报」第九城市与法拉第未来成立合资公司,出资6亿美元;华为获得韩国运营商5G订单,占比95%... 1
- Educational Codeforces Round 57 (Rated for Div. 2)
- 【十一】Jmeter 函数助手实战:__time 时间戳函数
- flask ajax json html,后端后,渲染模板通过Flask中的Ajax从前端接收JSON