类文件结构

本文大体讲一下结构,着重从理解层面看,就是当时我最难理解的地方讲,并不会深入的讲解某一块的具体结构信息,如果要看结构信息还请另行搜索

前提:实现语言无关性的基础仍然是虚拟机和字节码存储格式

对不同的平台进行不同的虚拟机实现(主要还是解释指令码)以达到语言与平台无关,最核心的还是虚拟机进行的转换。

Java语言的定义时就拆分了Java语言规范和Java虚拟机规范,这个虚拟机规范就是定义Class文件中字节码格式的,它和Java语言毫无关系,因此其它语言如果通过编译器能生成符合Java虚拟机规范的字节码,那么也可以运行在Java虚拟机上,并且Java虚拟机规范的字节码命令比Java语言本身的语法更强,这也提供了其它基于Java虚拟机运行的语言不同于Java的特性

Class文件结构

Class文件结构类似于C的结构体,只有两种数据类型,无符号数和表
表的意思有点像类型,可以定义表结构然后引用持有,下面的常量池内和属性表内就定义了很多预设的表结构供其他结构持有。理解了表的定义后面看结构信息就简单多了
java -v a.class可以查看统计之后的class文件,Class文件结构必须严格按照这个顺序定义并且排列JVM就直接安全这个顺序进行解析的。

1魔数,头4个字节都是魔数,java的为0xCAFEBABE
2class版本号:主次版本号依次排列
3常量池:常量池容量计数器和常量池本身,常量池包涵两大类常量,字面量和符号引用

常量池很重要,必须要理解了它后面才可以理解。 常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型(后面的很多数据类型都会指向此处),也是占用Class文件空间最大的数据项目之一。这里定义了一系列的固定结构信息,下面的信息很多都指向这里

4访问标志:2个字节,用于识别类或者接口层次的访问信息
5类索引,父类索引,接口索引集合:通过这三项数据确定类的继承关系
6字段表集合:描述接口或者类中声明的变量
7方法表集合:描述方法
8属性表集合:在class文件,字段表,方法表都可以携带自己的属性表,属性表包含很多拓展信息,包括代码字节码部分,签名,注解信息,废弃标志等,反正这里有很多信息可以用来拓展类信息的,如果有其它部分需要就持有即可.

属性表也很重要,代码什么玩意都是存在这里的,对于字段表啊,方法表啊的都是通过持有属性表数组达到描述自身的。

如图展示完整信息,每个class文件格式都必须是严格按照这个顺序排的


Class文件结构
常量池结构定义

从这里图中可以看到常量池的结构中几乎包含了所有涉及的类结构定义。你的类中涉及到多少那么就载入多少到常量池中进行使用即可,属性表也是一样的。

字节码指令

Java虚拟机指令由一个字节长度的,代表着某种特定操作含义的数字(操作码)以及跟随其后的零个或多个参数(操作数)而构成。

Java虚拟机采用面向操作数栈而不是寄存器架构,所以大多数指令都不包含操作数

有兴趣的可以自行搜索一下这俩的区别,后面讲虚拟机执行引擎的时候会详细解释基于操作数栈的执行流程。想要理解字节码指令需要先了解操作数栈架构的执行流程,这里不太理解也不重要,先知道一下。

字节码按照用途大致分为9类:
1加载和存储指令:将数据在帧栈中的局部变量表盒操作数栈之间来回传输
2运算指令:加减乘除,求余,取反,位移。。等等
3类型转换:主要是显示类型转换或者将无法操作的数据类型转换为可以操作的数据类型
4对象创建与访问:实例的创建和数组的创建
5操作数栈管理指令:可以直接出栈,复制,交换等
6控制转移指令:有条件或者无条件的修改PC寄存器的值
7方法调用和返回指令:名字说明一切
8异常处理指令:athrow指令处理抛出的异常,catch的异常通过异常表完成
9同步指令:monitorenter和monitorexit,进入和退出

第一次看的时候都不太相信就靠这些指令就完成了我代码的逻辑转换,但是仔细一看基本都包含的代码的运行逻辑功能。如果是简单的解释器实现那JVM也太简单了吧。很明显JVM并不是简单的解释器,它还有JIT的特性以提高性能。

总结

看了一圈就忘了,还是理解理解就好了吧。有一点还是有很多收获的,了解了class文件结构知道了原来代码都是在属性表存着,实际的实例对象还是指向原来的class对象来进行方法的执行,实例对象本身只存储数据。
对于Java有ASM的一些字节码操纵包可以修改class结构安全且高效,很多框架的动态代理就是基于这个实现的,典型就是cglib。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容