字节码指令

文章详细介绍了字节码指令的组成,包括操作码和操作数,以及如何通过工具如javap解析class文件。还探讨了class文件的结构,如魔术数、版本号、常量池等。此外,讲解了不同类型的字节码指令,如加载与存储、算术运算、方法调用(如invokevirtual、invokestatic等),并提到了动态绑定的invokedynamic指令。
摘要由CSDN通过智能技术生成

字节码指令

虚拟机指令是由一个字节的长度的代表着某种操作含义的操作码,以及后面跟上一个操作数。所以由操作码+操作数就构成了我们具体使用的一个指令。也不尽然,也会有一些特殊的操作码不含有操作数构成了一个指令。

字节码文件解读

  • Notepad++
  • Binary Viewer
  • Bytecode viewer 这个更高级一点,和我们在 idea 安装的插件是一样的(Jclasslibe),所以我们没必要再去单独安装一下,可以直接在 idea 中使用
  • javap -v *.class 可以使用 Java 自带的Java解析工具来实现 class 文件的解读

class 文件结构

  • 魔术
    • Magic number
  • 版本号
    • 编译 jdk 的版本号
  • 常量池
    • 字面量和符号引用
  • 访问标识
    • 对当前类的声明是什么(public、private…)
  • 类索引、父类索引、实现的接口集合
  • 字段表集合
  • 方法表集合
  • 属性表集合

字节码

加载与存储指令

# 从操作数栈中弹出元素放到局部变量 1 的位置
istore_1
# 压栈,表示从局部变量表压入到操作数栈中
xload_<n> (x 为 i、l、f、d、a、n,n 为 0 ~ 3)
xload (x 为 i、l、f、d、a) 
# 常量入栈
const
push
- bipush(8 位整数)、sipush(16 位整数)
ldc (如果 const 和 push 都不可以满足需求则可以使用这个来处理)

算数运算

# 加法
iadd ladd fadd dadd
# 减法
isub lsub fsub dsub
# 乘法
imul lmul fmul dmul
# 除法
idix ldiv fdiv ddiv
# 求余
irem lrem frem drem
# 取反
ineg lneg fneg dneg
# 自增指令
iinc
# 比较指令
dcmpg dcmpl fcmpg fcmpl lcmp
# 位运算
  # 位移指令
  ishl sihr iushr lshl lshr lushr
  # 按位或
  ior lor
  # 按位与
  iand land
  # 按位异或
  ixor lxor

方法调用

  • invokevirtual
    • 用于调用对象实例方法,根据对象的实际类型分派(虚方法分派),支持多态,这也是 Java 语言中最常见的方法分派方式
  • invokeinterface
    • 用于调用接口方法,它会在运行时搜索由特定对象所实现的这个接口方法,并找到合适的方法进行调用
  • invokespecial
    • 用于调用一些需要特殊处理的实例方法,包括初始化方法(构造器)、私有方法和父类方法。这些方法都是静态类型绑定的,不会在调用时进行动态分派
  • invokestatic
    • 用于调用类中类方法(static 修饰的方法)。这是静态绑定的
  • invokedynamic
    • 调用动态绑定的方法,这个是 JDK1.7 后加入的指令,用于在运行时动态解析出调用点限定符所引用的方法,并执行方法。前面四个方法的调用指令都固化在 Java虚拟机 内部,而 invokedynamic 指令的分派逻辑是由用户所设定的引用方法决定的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值