java执行字节码的语句_Java字节码指令

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码,Opcode)以及跟随其后的零至多个代表此操作所需的参数(操作数,Operands)构成。即:Java指令 = 操作码 + 操作数。

由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。

Java虚拟机解释器的执行模型如下:

do {

自动计算PC寄存器的值加1;

根据PC寄存器的指示位置,从字节码中取出操作码;

if (字节码存在操作数) 从字节码流中取出操作数;

执行操作码所定义的操作;

} while (字节码流长度 > 0)

一. 字节码与数据类型

在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息,如:

iload指令用于从局部变量表中加载int型的数据到操作数栈中;

fload指令则是从局部变量表中加载float类型的数据到操作数栈中;

上述两条指令的操作在虚拟机内部可能会由同一段代码来实现,但在Class文件中它们必须拥有各自独立的操作码。

对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:

i代表对int类型的数据操作;

l代表对long类型的数据操作;

s代表对short类型的数据操作;

b代表对byte类型的数据操作;

c代表对char类型的数据操作;

f代表对float类型的数据操作;

d代表对double类型的数据操作;

a代表对reference类型的数据操作;

二. 字节码类型

1ad68e2b8cc1

字节码指令

1. 加载和存储指令

加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输,包括:

将一个局部变量加载到操作数栈:

iload、iload_、lload、lload_、aload、aload_等

将一个数值从操作数栈存储到局部变量表:

istore、istore_、lstore、lstore_、astore、astore_等

将一个常量加载到操作数栈:

bipush、sipush、ldc、aconst_null、iconst_

扩充局部变量表的访问索引的指令:

wide

2. 运算指令

运算或算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。

加法指令:

iadd、ladd、fadd、dadd。

减法指令:

isub、lsub、fsub、dsub。

乘法指令:

imul、lmul、fmul、dmul。

除法指令:

idiv、ldiv、fdiv、ddiv。

求余指令:

irem、lrem、frem、drem。

取反指令:

ineg、lneg、fneg、dneg。

位移指令:

ishl、ishr、iushr、lshl、lshr、lushr。

按位或指令:

ior、lor。

按位于指令:

iand、land。

按位亦或指令:

ixor、lxor。

局部变量自增指令:

iinc

比较指令:

dcmpg、dcmpl、fcmpg、fcmpl、lcmp。

Java虚拟机要求在进行浮点数运算时,所有的运算结果都必须舍入到适当的精度,非精确的结果必须舍入为可被表示的最接近的精确值。

3.类型转换指令

类型转换指令可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中的显式类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。

Java虚拟机直接支持小范围类型向大范围类型的安全转换:

int类型到long、float、double类型转换

long类型到float、double类型转换

float类型到double类型转换

4.对象创建与访问指令

类实例和数组都是对象,但Java虚拟机对类实例和数组的创建与操作使用了不同的字节码指令。

创建类实例的指令:

new

创建数组的指令:

newarray、anewarray、multianewarray。

访问类字段(static字段)和实例字段的指令:

getfield、putfield、getstatic、putstatic。

把一个数组元素加载到操作数栈的指令:

baload、caload、saload、iaload、laload、faload、daload、aaload。

将一个操作数栈的值存储到数组元素中的指令:

bastore、castore、sastore、iastore、fastore、dastore、aastore。

取数组长度的指令:

arraylength

检查类实例类型的指令:

instanceof、checkcast。

5. 操作数栈管理指令

同操作一个普通数据结构中的堆栈那样,Java虚拟机提供了一些用于直接操作操作数栈的指令。

将操作数栈的栈顶一个或两个元素出栈:

pop、pop2。

复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:

dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2。

将栈最顶端的两个数值互换:

swap

6. 控制转移指令

控制转移指令可以让Java虚拟机有条件或无条件地从指定的位置指令而不是控制转移指令的下一条指令继续执行程序。

条件分支

ifeq、iflt、ifle、ifne、...

复合条件分支

tableswitch、lookupswitch。

无条件分支

goto、goto_w、jsr、jsr_w、ret。

7.方法调用和返回指令

invokevirtual指令用于调用对象的实例方法,根据对象的实际类型进行分派。

invokeinterface指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。

invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。

invokestatic指令用于调用类方法(static方法)。

invokedynamic指令用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法。

方法调用指令与数据类型无关,而方法返回指令是根据返回值的类型区分的,包括ireturn(当返回值是boolean、byte、char、short和int类型时使用)、lreturn、freturn、dreturn和areturn。

8.异常处理指令

athrow指令用来实现显式抛出异常的操作

9.同步指令

Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的。

方法级的同步是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池的方法表结构中的ACC_SYNCHRONIZED访问标志得知一个方法是否声明为同步方法。

同步一段指令集序列通常是由Java语言中的synchronized语句块来表示的,Java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3分钟了解今日头条推荐算法原理(附视频+PPT)

来源:大数据文摘概要:2018年1月,今日头条资深算法架构师曹欢欢博士,终于首次公开今日头条的算法原理,以期推动整个行业问诊算法、建言算法,希望消除各界对算法的误解。今日头条的内容分发算法一直颇神秘低调…

高效休息法--总结

思维导图:https://www.processon.com/view/link/60d6fcaf1e08532a43bea653

执行-技术人的管理之路--总结

思维导图:https://www.processon.com/view/link/5f0a6983e401fd0c8fffa75b

java进度条动画_Android自定义控件之圆形进度条动画

本文实例为大家分享了Android实现圆形进度条动画的具体代码,供大家参考,具体内容如下首先贴上图片:额,感觉还行吧,就是进度条的颜色丑了点,不过咱是程序员,不是美工,配色这种问题当然…

人脸识别必读的N篇文章

来源:机器视觉概要:人脸检测/跟踪的目的是在图像/视频中找到各个人脸所在的位置和大小;对于跟踪而言,还需要确定帧间不同人脸间的对应关系。一 、人脸检测/跟踪人脸检测/跟踪的目的是在图像/视频中找到各个人脸所在的位置和大小&a…

所谓高情商就是会说话--总结

思维导图:https://www.processon.com/view/link/60d6fe741e08532a43bea811

美国12大科技公司如何参与自动驾驶?

来源:腾讯科技概要:无人驾驶汽车的潜力已经逐步显现,这一点,从本周在拉斯维加斯举行的国际消费电子展(CES)就可以看出端倪。无人驾驶汽车的潜力已经逐步显现,这一点,从本周在拉斯维加…

java web响应式框架_Web开发的十佳HTML5响应式框架

HTML5框架是一类有助于快速轻松创建响应式网站的程序包。这些HTML5框架有着能减轻编程任务和重复代码负担的神奇功能。关于HTML5的框架种类繁多,并且很瘦欢迎,因为它能允许开发人员花费更少的时间和精力去创建一个令人惊艳的网站。在本文中,我…

开放-封闭原则(OCP)

开放-封闭原则(The Open-Close Principle) 软件实体(类、模块、函数等)应该是可以扩展的,但是不可以修改的。 两个特征 1、对于扩展是开放的(Open for extension); 2、对于更改是…

风向2018 | AI 突围

来源:36氪概要:回到战场,考验各家公司CEO和谋士的时刻,已经到来。问:2017年AI行业最大的进展是什么?答:创业公司的估值。高估值,曾将AI初创公司带上高光的创投舞台,也正将…

php return 值_php return的用法是什么

php return的用法:1、通过“return expression”语法返回一个表达式结果;2、使用“return(expr)”语法返回函数表达式;3、直接使用return返回值即可。本文操作环境:Windows7系统、PHP7.1、Dell G3电脑。基本用法:a)、r…

谷歌放出AI平民化大招: 李飞飞宣布推出AutoML云平台,让普通企业也能用上深度学习

作者:杨晓凡概要:谷歌云机器学习平台(Google Cloud AI)自从上线以来就以预训练的、可以直接调用的高效机器学习模型吸引了许多企业级用户在其上构建简单的机器学习应用。谷歌云机器学习平台(Google Cloud AI&#xff0…

AI博弈论:DeepMind让智能体在非对称博弈中找纳什均衡

Root 林鳞 编译自 DeepMind官方博客量子位 出品 | 公众号 QbitAI随着人工智能系统在现实世界中扮演越来越重要的角色,理解不同的系统如何相互作用至关重要。刚刚,DeepMind发表了一篇名为Symmetric Decomposition of Asymmetric Games的论文。在这篇论文中…

php ie 下载 乱码,php ie下载文件名乱码怎么办

php ie下载文件名乱码的解决办法:1、通过header方法解决乱码;2、通过“function remote_filesize($uri,$user,$pw) {...}”等方法解决乱码。php文件下载IE文件名乱码问题一直用chrome浏览器,没发现问题。今天用ie6,发现文件下载时…

无人驾驶技术排名:百度居中游,苹果特斯拉垫底 | 行业

来源:网易科技概要:其调查研究显示,无人驾驶汽车行业的现状已经发生了天翻地覆的变化,而特斯拉、苹果公司在今年的排名垫底。1月17日消息,据CNET网站报道,日前,美国市场研究机构Navigant Resear…

h5 换脸 php,【部分原创】python实现视频内的face swap(换脸)

1.准备工作,按博主的环境为准Python 3.5Opencv 3Tensorflow 1.3.1Keras 2cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装那就先安装起来,有兴趣的朋友给我个暗示,好让我有动力写下去,想实现整套…

接口隔离原则(ISP)

接口隔离原则(The Interface Segregation Interface) 这个原则用来处理“胖(fat)”接口(类的接口不是内聚的)所具有的缺点。“胖”接口可以分解成多组方法。 考虑一个安全系统,有一些Door对象&a…

马歇尔·赫伯特:人工智能的前沿技术与实例分析

来源:中国人工智能学会2017年12月11日,国际知名机器人专家、美国卡耐基梅隆大学机器人研究所所长马歇尔赫伯特(Martial Hebert)教授和首席科学家大卫伯恩(David Bourne)教授访问了中国科学技术大学参观中科大机器人实验室并作演讲。演讲人简介&#xff1…

ActiveMQ消费者平滑关闭

平滑关闭的思路就是让正在执行的任务线程正常执行完毕,然后再关闭JVM。在JVM关闭之前触发一个shutdown hook,jvm自带这个hook,在java启动时候就可以注册这样的hook。 ##1、简述JVM关闭钩子(shutdown hook) 首先JVM的关…

二叉堆时间复杂度 php,二叉堆(Binary Heap)

二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下:二叉堆性质二叉堆操作应用二叉堆性质:堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性:缺少的叶子节点总是位于右子节点n个节…