写点什么

Java 字节码技术学习笔记

用户头像
风翱
关注
发布于: 1 小时前

Java 字节码技术学习笔记

一、字节码是什么?

Java bytecode 是由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode)。

实际上 Java 只使用了 200 左右的操作码,还有一些操作码则保留给调试操作。


二、字节码分类

根据指令的性质,主要分为四个大类:

  1. 栈操作指令,包括与局部变量交互的指令。

  2. 程序流程控制指令。

  3. 对象操作指令,包括方法调用指令

  4. 算术运算以及类型转换指令。


三、查看字节码命令:

javap <options> <classes>

可以通过 javap -help,查看 options 代表的意义:

 -help  --help  -?        输出此用法消息 -version                 版本信息,其实是当前javap所在jdk的版本信息,不是class在哪个jdk下生成的。 -v  -verbose             输出附加信息(包括行号、本地变量表,反汇编等详细信息) -l                         输出行号和本地变量表 -public                    仅显示公共类和成员 -protected               显示受保护的/公共类和成员 -package                 显示程序包/受保护的/公共类 和成员 (默认) -p  -private             显示所有类和成员 -c                       对代码进行反汇编 -s                       输出内部类型签名 -sysinfo                 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列) -constants               显示静态最终常量 -classpath <path>        指定查找用户类文件的位置 -bootclasspath <path>    覆盖引导类文件的位置
复制代码


四、字节码的运行时结构

JVM 是一台基于栈的计算机器。每个线程都有一个独属于自己的线程栈,用于存储栈帧。

每一次方法调用、JVM 都会自动创建一个栈帧。

栈帧由操作数栈、局部变量数组以及一个 Class 引用组成。Class 引用指向当前方法在运行时常量池中对应的 Class。


五、方法调用的指令

Invokestatic:用于调用某个类的静态方法,这是方法调用指令中最快的一个。

Invokespecial:用来调用构造函数,但也可以用于调用同一个类中的 private 方法,以及可见的超类方法。

Invokevirtual:如果是具体类型的目标对象,invokevirtual 用于调用公共、受保护和 package 级的私有方法。

Invokeinterface:当通过接口引用来调用方法时,将会编译为 invokeinterface 指令。

Invokedynamic:JDK7 新增加的指令,是实现“动态类型语言”支持而进行的升级改进,同时也是 JDK8 以后支持 lambda 表达式的实现基础。

发布于: 1 小时前阅读数: 3
用户头像

风翱

关注

还未添加个人签名 2017.11.24 加入

勇于尝试,持续成长

评论

发布
暂无评论
Java字节码技术学习笔记