Class的本质及内部数据结构


Class本质

 

本篇文章标题我用的是Class本质,并没有说是Class文件本质,原因是一般情况下我们常见到的Class文件是以存储在磁盘中的形式存在的,然而Java虚拟机并不会这么‘死板’,只要符合Java虚拟机规范的Class信息都是可以被正确识别的,无论他是存储在磁盘中(文件),还是以二进制流的方式直接输送到类加载器中。

这里可能有些牵强,磁盘中的Class文件、二进制流的Class流都可以说是文件,文字游戏并不是重点,重点是突出Java虚拟机设计之灵活。

 


Class文件格式

 

任意一个符合Java虚拟机规范的class信息格式是严格限定的,甚至没有任何分隔符的紧凑排列,每个字节的长度、含义、顺序都不允许被改变。

 


Class数据类型

 

任一Class结构中只有两种数据类型,分别是 无符号数表 。

无符号数(基本类型):无符号数分别用 u1 u2 u4 u8代表 1 2 4 8个字节来描述数字、引用、字符串等,这种表现方式类似于C语言结构体。

表:表是一种符合数据类型,其组成可以是多个表的组合或者是多个无符号数组合,这样便能更好的描述有层次关系的复合结构类型。

【注】一个类、方法就相当于一个表,表常用 _info 的标志来说明这是一个表文末解释说明

【注】由于字节码没有分隔符的排列,对于表来说,通常在他的前面会有个数说明(文末解释说明

 

这里对表的理解可能有些抽象,就拿一个类来简单说明下:

 


Class文件结构

 

从Java虚拟机第一版发行至今,Class文件的基本结构和框架是非常稳定的,虽然目前有多个版本的Java虚拟机规范,但对Class文件的整体的结构及框架的改动是很少的。

Class文件整体结构如下:

 

  • 魔术
  • Class版本
  • 常量池
  • 访问标识
  • 类、父类、接口索引集合
  • 字段表集合
  • 方法表集合
  • 属性表集合

 

对照Java虚拟机规范中的案例解释如下:

 


 

注意到Class文件结构中描述各个结构的数据类型处理 u1 u2 外还有  xx_info 形式的,这就是表的标志,并且凡是有表的其前面会有一个长度说明

 


相关BAT面试题:

 

1、类文件结构有几个部分?(BAT)

2、知道字节码吗?字节码都有那些?

3、从字节码角度说说 Integer x = 9; int y = 9; 比较 x == y 都经过了那些步骤?

 


以上内容就是有关Class文件的本质特性及内部结构信息,希望该笔记对你有所帮助,欢迎讨论!

福利pycharm、idea、全家桶正版激活

 

更多精彩内容请关注公众号数据与编程之美

数据特征处理之文本型数据(特征值化二)TF-IDF

 

0

评论0

请先

没有账号? 注册  忘记密码?