文章目录
前言
为什么要阅读Java字节码?我觉得有这几方面原因,一方面,可以了解Java虚拟机具体是如何执行我们的代码的,另一方面也可以看到Java虚拟机对于我们代码的优化。
准备事宜
1 下载UltraEdit
UltraEdit 是理想的文本、HTML 和十六进制编辑器,也是高级 PHP、Perl、Java 和 JavaScript 程序编辑器。作为行业奖项的获得者,UltraEdit 在所有 32 位 Windows 平台上支持基于磁盘的 64 位文件处理(标准)。请立即下载免费试用版,以体验为何 UltraEdit 会成为事实标准并在全球拥有两百多万用户。
我们下载此软件,主要目的是阅读Class字节码,这里提供Windows版本的破解版地址。
UltraEdit27 免激活破解版(无需注册码和许可证)
下载Java虚拟机规范(Java SE 8版)
链接: https://pan.baidu.com/s/1dCQnJYCLci9gmLe73CGOpg 密码: wicb
当然,如果你英文比较好的话,也可以直接阅读官网原版。其实在学习角度来说,Java8的翻译版是足够的。
Java虚拟机规范英文版-15
一、生成字节码
这里我使用的jdk版本是1.8,各个版本的jdk生产的字节码会有些不一样,但是类的大致结构还是相似的。
Java源码
public class HelloWorld {
public static String msg = "Good morning";
public static void main(String[] args) {
System.out.println("msg == " + msg);
}
}
首先使用javac生产class文件,然后使用javap命令生产可以阅读的字节码信息。
javap生成的字节码
Classfile /E:/JavaCode/Kotlin/src/kotlins/Hello.class
Last modified 2020-12-19; size 812 bytes
MD5 checksum 996b16551ea3f9e6f29de10986273df0
Compiled from "Hello.java"
public class kotlins.Hello
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #12.#29 // java/lang/Object."<init>":()V
#2 = Fieldref #30.#31 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Class #32 // java/lang/StringBuilder
#4 = Methodref #3.#29 // java/lang/StringBuilder."<init>":()V
#5 = String #33 // msg ==
#6 = Methodref #3.#34 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#7 = Fieldref #11.#35 // kotlins/Hello.msg:Ljava/lang/String;
#8 = Methodref #3.#36 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#9 = Methodref #37.#38 // java/io/PrintStream.println:(Ljava/lang/String;)V
#10 = String #39 // Good Morning
#11 = Class #40 // kotlins/Hello
#12 = Class #41 // java/lang/Object
#13 = Utf8 msg
#14 = Utf8 Ljava/lang/String;
#15 = Utf8