JVM Class详解之二 Method字节码指令

  • 时间:
  • 浏览:1
  • 来源:大发时时彩代理—大发大发彩票app

大家通过javap -verbose HelloWorldMethod.class 查看字节码指令





大家按照指令一根绳子 一根绳子 看

0:iload_1:将本地变量中第另另另4个int (a)加载到栈顶

为你這個是a呢,大家再看LovalVariableTable。每个最好的土办法全是LocalVariableTable。是本地变量表。大家还上能看了在本地变量表中的第另另另4个int可是我a



1:ifge:判断栈顶的int与否大于0如果大于将1压入栈顶,如果不大于将0压入栈顶

分支1:如果当前值不大于0将0压入栈顶,

分支2:如果当前值大于0跳转到指令6

4:iconst_m1:将整型-1压入栈顶 

5:ireturn

好了至此大家就知道了大家JAVA文件编译后的Method带有你這個东西,JVM又是如何读取字节码指令做相应操作的了。

6:iload_2:将本地变量汇总第4个int(b)压入栈顶

7:ifge:判断栈顶的int与否大于0

分支3:如果当前值不大于0,将栈顶压入0

分支4:如果当前值大于0,将1压入栈顶,并跳转到执行12执行

10:iconst_m1:将int -1压入栈顶

11:ireturn:返回栈顶int值

JVM Class详解之一中大家介绍了Class文件的特征和如何使用16进制编辑器读懂class文件。

今天大家来继续一起去下Class文件中Method最好的土办法中经过java编译器编译后的Method字节码指令是你這個样子的

除了本地变量到栈顶,还有常量到栈顶

bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_

ldc:将int,float或String型常量从常量池中推送至栈顶

iconst_0:将int型0推送至栈顶

new:创建另另另4个对象

newarray:创建另另另4个指定的原始类型数组

anewarray:创建另另另4个引用型的数组,并将其引用值压入栈顶

arraylength:获取数组的长度并压入栈顶

athrow:将栈顶的异常抛出

checkcast:检查类型转换,检查未通过会抛出ClassCastException

instanceof:检查与否指定的类的实例,如果是,将1压入栈顶,全是将0压入栈顶

好至此主要的指令如果介绍完毕,为什么么么分类仁者见仁啦。

load是从本地变量到栈顶,store是从栈顶到本地变量

istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_

istore:将栈顶int型数值存入制定数组的指定索引位置

是将本地变量中的数据推送入栈中 (你這個是本地变量大家底下聊)

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

iload_0:将第另另另4个int型本地变量推送至栈顶

iload中i表示为int型(l为long,f为float,d为double ,a为引用类型),load表示动作为load,

底下的指令大多全是你這個特征,先是声明操作数类型,再说明具体动作。

同理 fload:将本地变量的float型数据推送栈顶

Code中 还有另外另另另4个东西



你這個是你這個,你這個是LineNumberTable,其中记录了编译出来的字节码指令和源码的对应关系

你這個属性全是一阵一阵要。另外可是我另另另4个源码会对应多条指令的

monitorenter:获取对象的锁,用于同步最好的土办法如果同步块

monitorexit:释放对象的锁

getstatic:获取指定类的静态域,并将其值压入栈顶

putstatic:为指定的类的静态域赋值

getfield:获取指定类的实例域,并将其值压入栈顶

pufield:为指定类的实例域赋值

invokevirtual:调用实例最好的土办法

invokespecial:调用超类构造最好的土办法,实例初始化最好的土办法如此最好的土办法

invokestatic:调用静态最好的土办法

invokeinterface:调用接口最好的土办法

invokedynamic:调用动态最好的土办法

首先大家必须了解JVM有你這個字节码指令

ifeq:当栈顶int型数值等于0时跳转

ifne:当栈顶int型数值不等于0时跳转

iflt:当栈顶int型数值小于0时跳转

ifge:大于等于0

ifgt:大于0

ifle:小于等于0

if_icmpeq:比较栈顶另另另4个int大小,等于0跳转

if_icmpne:不等于0跳转

。。。

goto:无条件跳转

goto,goto_w,jsr,jsr_w,ret 

ifnull:为null时跳转

ifnonnull:不为null时跳转

finally关键字的实现使用:jsr,jsr_w,ret

wide:扩展本地变量的深度图

12:iload_1:将本地变量第另另另4个int压入栈顶(a)

13:iload_2:将本地变量第4个int压入栈顶(b)

14:iadd:将栈顶的另另另4个int相加并将结果压入栈顶 a+b

15:istore_3:将栈顶的int值,存入本地变量表中第另另另4个int,第另另另4个int为c,将结果付给了c



16:iload_3:将本地变量中的第另另另4个int压入栈顶,取出c

17:ireturn:将栈顶的第另另另4个int返回

ireturn:从当前最好的土办法返回int

lreturn:从当前最好的土办法放回long

。。。

return:从当前最好的土办法返回void

lcmp:比较栈顶另另另4个long型数值的大小,并将结果(1,0,-1)压入栈顶

fcmpl:比较栈顶另另另4个float型数值的大小,并将结果(1,0,-1)压入栈顶,当其中另另另4个为NaN,将-1压入栈顶

fcmpg:。。。。。其中另另另4个为NaN,将1压入栈顶

dcmpl

dcmpg

加:iadd,ladd,fadd,dadd  :将栈顶另另另4个数值相加并将将结果压入栈顶

减:is ,ls ,fs ,ds 

乘:imul,lmul,fmul,dmul 

除:idiv,ldiv,fdiv,ddiv 

余数:irem,lrem,frem,drem 

取负:ineg,lneg,fneg,dneg 

移位:ishl,lshr,iushr,lshl,lshr,lushr 

按位或:ior,lor 

按位与:iand,land 

按位异或:ixor,lxor 

类型转换:i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换) 

i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)

你這個很简单的顾名思义哈哈。

这类源码中的第5行return -1 ,对应指令为4和5

你這個intAddMethod最好的土办法传入另另另4个int,判断与否小于0,如果小于返回-1,全是小于返回相加值