Java 字节码技术学习笔记
Java 字节码技术学习笔记
一、字节码是什么?
Java bytecode 是由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode)。
实际上 Java 只使用了 200 左右的操作码,还有一些操作码则保留给调试操作。
二、字节码分类
根据指令的性质,主要分为四个大类:
栈操作指令,包括与局部变量交互的指令。
程序流程控制指令。
对象操作指令,包括方法调用指令
算术运算以及类型转换指令。
三、查看字节码命令:
javap <options> <classes>
可以通过 javap -help,查看 options 代表的意义:
四、字节码的运行时结构
JVM 是一台基于栈的计算机器。每个线程都有一个独属于自己的线程栈,用于存储栈帧。
每一次方法调用、JVM 都会自动创建一个栈帧。
栈帧由操作数栈、局部变量数组以及一个 Class 引用组成。Class 引用指向当前方法在运行时常量池中对应的 Class。
五、方法调用的指令
Invokestatic:用于调用某个类的静态方法,这是方法调用指令中最快的一个。
Invokespecial:用来调用构造函数,但也可以用于调用同一个类中的 private 方法,以及可见的超类方法。
Invokevirtual:如果是具体类型的目标对象,invokevirtual 用于调用公共、受保护和 package 级的私有方法。
Invokeinterface:当通过接口引用来调用方法时,将会编译为 invokeinterface 指令。
Invokedynamic:JDK7 新增加的指令,是实现“动态类型语言”支持而进行的升级改进,同时也是 JDK8 以后支持 lambda 表达式的实现基础。
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/46a6d65fc290b076f7b8bfbe0】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论