类文件结构

摘抄: 陈树义 Java技术精选

-各个语言的编译器吧文件编译成字节码,jvm把字节码解释给操作系统,或者是编译成机器代码

class类文件结构(一个自己代表两个字节码)

  • class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中。
  • 当遇到需要占用8位字节以上空间的数据项时候,会按照高在前的方式分割成若干个8位字节进行存储。
  • 在字节码结构中,有两种最基本的数据类型来表示字节码文件格式,分别是:无符号数和表。
无符号数属于最基本的数据类型
  • 1.它以 u1、u2、u4、u8 六七分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数.
  • 2.可以用来描述数字、索引引用,数量值或者按照UTF-8编码构成的字符串值。
表是由多个无符号数或者其他表作为数据项构成的复合数据类型
  • 1.所有表都习惯性地以_info结尾。表用于描述有层次关系的复合结构的数据

比如u4 代表四个字节 可以用来标识java的魔数

比如cp_info标识常量池


无符号数和表.jpg

上图就是我们一个类文件包含的东西

  • 魔数与Class文件版本
  • 常量池
  • 访问标志
  • 类索引、父类索引、接口索引
  • 字段表集合
  • 方法表集合
  • 属性表集合
    我们一般要描述同一类型 但是数量不定的多个数据的时候,经常会使用一个前置容量计数器加若干个连续的数据项形式,比如常量池个数+常量池
    上图的数据之前顺序是严格的不能出现混乱
魔数与class文件的版本
  • 魔数:确定这个文件是否能被虚拟机接受的class文件。
  • 次版本号和主版本号,分别是5,6字节和7,8字节。注意高版本的jdk能处理低版本的字节文件,但是不能处理高于jdk版本的字节文件
常量池
  • 常量池入口处存放一个u2类型,标识常量池中的常量数量。

  • 此处容量技术是从1开始的

  • 常量池值存放字面量(字符串或final的常量值)和符号引用

  • 符号引用:类和接口的全限定名称,字段的名称和描述符,方法的名称和描述符

  • 常量池的常量都是由cp_info这种表结构组成的,而且表结构不同其大小也不同。在 Java 虚拟机规范中一共有 14 种 cp_info 类型的表结构。

  • 当虚拟机运行时,需要从常量池获得对应的符号引用,再类创建时或运行时进行解析,并得到具体的内存地址。


    常量池的表.jpg
  • 14种cp_info类型的表结构如下图


    表结构.jpg
  • 根据表的类型我们可知道,常量池中还存有符号引用(类似于占位符,等到具体的对象地址形成后替换)

  • 根据表的结构可知道各个常量的最大长度值是u2即65535

访问标识
  • 这个class 是接口还是类,是什么访问类型,是否问abstract,是否是被final声明的类 等待


    访问标识.jpg
类索引,父类索引与接口索引集合
  • 类索引和父类索引都是一个u2类型的数据,因为java只能单继承
  • 接口是索引是一组u2类型集合,这是因为接口可以实现多个。
  • 类索引确定这个类的全限定名,父类索引用于确定父类的全限定名
  • 所有类除了object 都有父索引
字段表集合
  • 用于描述接口或类中声明的变量
  • 描述符可以描述字段的数据类型
  • 这些字段仅仅包括类级和实例级别变量,我们在方法内部声明的不算
  • 方法表中的每个方法都用一个 method_info 表示,其数据结构如下:
  • 因为字段名字和字段类型,是无法使用修饰符来表示,所以只能引用常量池中的常量来描述,即通过name_index和descriptor_index都是常量池的引用
  • 字段表中也有属性表


    微信截图_20181120230510.png
方法表集合
  • 方法描述符要复杂,描述符用来描述方法的参数列表(数量,类型以及顺序)和返回值。
    基本类型和无返回值的类型都用大写字符来表示(比如整数就是INT,无返回值就是V),而对象类型则用字符L加对象的全限定名(Ljava.lang.object)。数组就是在前面加个[整形数组就是[I

  • 描述描述方法时,先参数列表后返回值,参数列表按照参数的严格顺序放在一组小括号之内,如方法void inc()的描述符()V,如果是int indexof(int a)=(I)I


    微信截图_20181120233315.png
微信截图_20181120231051.png
  • 包含描述方法字节码的code属性表

  • 方法表中也有属性表

  • <clinit>代表类构造器,<init>代表实例构造器。前者会执行我们static{},类变量(父类的<clinit>会由该类被加载的时候自己调用,jvm会确保父类的<clinit>比子类<clinit>的调用造)。后者会执行{},实例变量和父类的实例构造器。

  • 我们在类里面重载一个方法除了方法名称一样外,必须确保参数不同,如果参数相同但是返回值不同,则无法通过编译。但是如果我们绕过验证把他们编译成class文件,虽然返回值不同 但是也可以合法共存在同一个class文件中

属性表集合
  • class文件,字段表,方法表都可以携带自己的属性表集合
  • jvm 规定下列几个属性


    微信截图_20181120234904.png
  • 对于每个属性,他的名称需要从常量池中引用一个constant-utf8_info类型的常量来标识,至于属性值的结构完全可以自定要,只要说明这个属性值所占用的位数长度即可
  • 下面就是规定了属性的名称索引,属性的长多,属性是由一个表info标识


    微信截图_20181120235110.png
code属性表如下:
微信截图_20181120231517.png
  • code属性的名称固定为Code,抽象方法或者接口方法没有改属性。其他类的方法表会出现这个属性
  • max_stack 操作数栈的最大深度,即有多少个局部变量
  • max_Locals 代表局部变量表所需要的存储空间 这边单位是slot,除了double和long是需要2个slot 其他都是1个slot。slot可以重用,当某个局部变量在方法中超出其作用域,其可以被覆盖
  • invokespecial的作用是以栈顶的引用类型的数据所指向的对象作为方法的接收者。只能调用三类方法:<init>方法;private方法;super.method()。因为这三类方法的调用对象在编译时就可以确定。
  • invokevirtual是一种动态分派的调用指令:也就是引用的类型并不能决定方法属于哪个类型。
  • code属性还包含异常表,异常表不是必须存在的包含四个字段,start_pc到第end_pc(不包含)出现了catch_type或者其他子类的异常,则转到第handler_pc行继续处理。当catch_type=0代表任何的异常都需要转向handler_pc行处理
  • return 代表将值保存到returnVlaue中即最后一个本地变量表中的slot,当return真正执行的时候会把该值赋值到操作栈顶,作为方法返回值来使用。
exception属性
  • 其余code属性平级,与我们之前说的异常表不一样。其作用是列举出方法中可能抛出的受检查异常,也就是方法描述在throws关键字后面列举的异常
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 类文件结构 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式— 字节码( ByteCode ) 是构成平台无...
    好好学习Sun阅读 530评论 0 0
  • 我能做的只有控制自己的情绪 不管看到什么 你怂的原因是我不够强,心知肚明jpg 从来没有什么相同,我的这一秒永远都...
    南枝_____阅读 211评论 0 2
  • 第一章,抢小明和安迪死 五年的婚姻生活,让安迪疲惫不堪。手机响起,是秀原院长,安迪,你快点来医院。你的婆婆带着一堆...
    愛尽阅读 3,768评论 3 13
  • 《波纹》 文/无哲 这些古老的金色瓦楞 向南铺过去 与天空接壤 进入波纹的内部 我看到岁月的一半 浮在水面 另一半...
    山西无哲阅读 320评论 0 1
  • 前几天非要把长发剪短,这两天估计开始后悔了,让我给她扎辫子,这么短,只能扎冲天辫了。加上两边翘起来的头发,效果还不...
    小小王_6e36阅读 253评论 0 0