Java 进阶:实例详解 Java 虚拟机字节码指令

众所周知,Java 语言编译生成的 class 文件可以运行在任何支持 Java 虚拟机的硬件平台和操作系统上。那么,你是否思考过:class 文件包含哪些内容?是如何在虚拟机中执行的?要弄清楚这些问题,须了解 class 文件结构和 Java 虚拟机字节码指令。Java 虚拟机字节码指令非常重要,学习它对深入理解虚拟机、栈、锁、异常、同步等的原理十分有益,是 Java 进阶之路必读内容之一。

本系列一共有两篇文章,这是第一篇,主要内容如下:

图文解读 class 文件结构;

Java 字节码介绍;

详解 Java 虚拟机栈结构;

实例解读 Java 虚拟机中变量、常量访问原理和指令体系;

实例解读 Java 虚拟机中对象、数组(数值数组、对象数组、多维数组)创建指令;

实例解读 Java 虚拟机中方法、字段 (又称域-field) 访问的原理及指令体系。

由于篇幅有限,这里只展示一部分,有需要完整版和更多相关资料的朋友可以加q群:1103806531  备注:简书   免费领取~

引言

计算机本身只能识别 0 和 1 构成的机器码,因此,任何编程语言最终都需要编译成机器码才能被计算机执行。以 C/C++ 为例,用它们编写的程序首先被编译,然后被连接成单独的、支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其它平台上工作。

Java 在诞生之初便提出了著名的 slogan:“Write Once, Run Anywhere”,为了实现这一目标,Java 虚拟机应运而生。目前,Java 虚拟机有很多版本,但它们都具有一个共同的特征——可以载入并执行同一种与平台无关的字节码(ByteCode)。 因为 Java 虚拟机的出现,Java 源代码不必根据不同平台编译成 0 和 1,而是间接翻译成字节码,储存字节码的文件再交由运行于不同平台上的 Java 虚拟机去读取执行,从而实现一次编写,到处运行的目的。

Java 编译生成的字节码文件为 ".class " 文件,它是一种二进制文件,其中包含了 Java 虚拟机指令集和符号表以及若干其它辅助信息。作为一个通用的、机器无关的执行平台,任何其它语言的实现者都可以将 Java 虚拟机作为语言的产品交付媒介。例如,使用 Java 编译器可以把 Java 代码编译成存储字节码的 class 文件,使用 Groovy、 Scala、 Koltin 等其它语言的编译器一样可以把程序代码编译成 class 文件,虚拟机并不关心 class 的来源是何种语言。

Class 文件结构

class 文件是一组以 8 位字节位基础单位的二进制流,采用一种类似 C 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。无符号数属于基本的数据类型,以 u1、u2、u4、u8 分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或 utf-8 编码构成的字符串值。表是由多个无符号数或其它表作为数据项构成的复合数据类型,所有表都习惯性地以 _info 结尾。 每一个 class 文件对应于一个如下所示的 ClassFile 结构体:

ClassFile {

u4 magic;//魔数

u2 minor_version;//副版本号

u2 major_version;//主版本号

u2 constant_pool_count;//常量池计数器,

cp_info constant_pool[constant_pool_count-1];//常量池列表

u2 access_flags;//访问标志

u2 this_class;//类索引,表示这个Class文件所定义的类或接口

u2 super_class;//父类索引

u2 interfaces_count;//接口计数器

u2 interfaces[interfaces_count];//接口表,接口顺序和源代码顺序一致

u2 fields_count;//字段计数器

field_info fields[fields_count];//字段表

u2 methods_count;//方法计数器

method_info methods[methods_count];//方法表

u2 attributes_count;//属性计数器

attribute_info attributes[attributes_count];//属性表

}

更直观地,通过图片来展示 class 文件的结构,如下所示:

Class 文件结构实例

从上面的介绍 class 文件的结构比较复杂,事实上,我们可以将 class 文件分为以下部分。

class文件: 文件描述、常量池、类概述、字段表、方法表、扩展信息表。为了便于读者理解,在此,我们先来看一个实例,Java 源码如下:

publicclassTest{

privateString  attribute_1;

privateInteger attribute_2;

publicvoidtestMethod_1(){

}publicStringtestMethod_2(String param){

returnparam;

}}

通过命令“javac Test.java”编译后,可以得到 Test.class 文件,这就是所谓的字节码文件,Test.class 内容如下所示:

cafebabe00000032001807000201001e636f6d2f746573742f646f632f6578702f546573

74436c617373436f64650700040100106a6176612f6c616e672f4f626a65637401000b61

74747269627574655f310100124c6a6176612f6c616e672f537472696e673b01000b6174

747269627574655f320100134c6a6176612f6c616e672f496e74656765723b0100063c69

6e69743e010003282956010004436f64650a0003000d0c0009000a01000f4c696e654e75

6d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869

730100204c636f6d2f746573742f646f632f6578702f54657374436c617373436f64653b

01000f74657374496e746572666163655f3101000f74657374496e746572666163655f32

010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f5374

72696e673b010005706172616d01000a536f7572636546696c6501001254657374436c61

7373436f64652e6a61766100210001000300000002000200050006000000040007000800

00000300010009000a0001000b0000002f00010001000000052ab7000cb100000002000e

00000006000100000003000f0000000c00010000000500100011000000010012000a0001

000b0000002b0000000100000001b100000002000e0000000600010000000b000f000000

0c0001000000010010001100000001001300140001000b0000003600010002000000022b

b000000002000e0000000600010000000e000f0000001600020000000200100011000000

00000200150006000100010016000000020017

最后

希望这篇文章对大家有帮助!

我这边也整理了一份 架构师全套视频教程 和关于java的系统化资料,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等都有。

有需要的朋友可以加q群:1103806531  备注:简书   免费领取~

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