ldc java_写Java但不懂Java系列之加载和存储

很多Java工程师语法用的很,但是真的让他说说Java是怎样运行的,我相信他会懵逼!!!

67bdca10ecea6b0a35ab18dcba8882e5.png

希望处于这个阶段的同学可以仔细阅Class文件系列的文章,这里涵盖了Class文件的绝大部分内容,当你阅读并理解之后,相信你不再迷茫。

不知道是否还记得Code属性,不记得的小伙伴建议回顾一下,Code属性中存储了今天我们将要讲解的字节码指令。

今天介绍一下字节码指令(加载和存储指令)。所谓的字节码指令就是JVM在运行时所需要进行的操作,字节码指令大致分以下集中类型:加载和存储指令

运算指令

类型转换指令

对象创建与访问指令

操作数栈管理指令

控制转移指令

方法调用和返回指令

异常处理指令

同步指令

对于大部分字节码指令,都包含了其操作所对应的数据类型,i对应Integer类型,l代表Long类型,f代表Float类型,d代表Double类型,a代表Reference类型,b代表byte类型,s代表short类型,c代表char类型。

加载和存储指令

加载和存储指令用于将数据在栈帧的局部变量表和操作数栈中传输。

局部变量加载到操作数栈

iload,iload_,lload, lload_, fload, fload_, dload, dload_, aload, aload_

其实只是助记符,比如iload_1意思是将局部变量表slot索引为1的int型元素压入操作数栈顶,iload_1完全等同于iload(1)。

1c9e91c0d6198b07a41f69cb53a5e3a8.png

操作数栈加载到局部变量表

istore,istore_、lstore, lstore_, fstore, fstore_, dstore, dstore_, astore, astore_。

istore_1作用就是将操作数栈顶元素保存到局部变量表索引为1的位置处。

将常量压入到操作数栈

bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_m1,iconst_,lconst_,fconst_,dconst_。

这里我们说一下ldc、ldc_w、ldc2_w,我们先看一下Java8虚拟机规范对它的定义,如下图:

df46aa0c71b5ed76240c2dbea1cad331.png

图上的意思大致是说将常量池中的一些特定类型的常量推入操作数栈顶,这些类型包括int,float,String, Class,java.lang.invoke.MethodType, java.lang.invoke.MethodHandle。

ldc等同于ldc_w, ldc2_w等同于ldc的特定类型的long和double。public class ClassTest {

public void test() {

Class c = Long.class;

String s = "test";

int r = Integer.MAX_VALUE;

float f = Float.MAX_VALUE;

long l = Long.MAX_VALUE;

double d = Double.MAX_VALUE;

}

}

4cdac84b1b663bd4b7e8deb0429fd52f.png

注意看红框中的部分,ldc #2,常量池中的第二项是个Class类型,符合虚拟机规范的描述;在看 ldc #3,常量池中的第三项是个String类型,符合虚拟机规范的描述;ldc2_w #8、ldc2_w #11,在常量池的第8和第11项分别是Long和Double型,符合虚拟机规范。

0743df78bec29168f9349fd7e0430018.png

JVM支持的是栈式指令集,在我们代码运行过程中,需要通过加载和存储指令来完成变量在局部变量表和操作数栈之间的传递。

本期的加载和存储指令就介绍到这,我们下期再见!!!

我是shysh95,希望可以和你专注技术的路上并肩作战,做跟绝大多数人不一样的事情,离平庸更远一点,扫码关注微信公众号,更多精彩文章!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值