一文带你读懂Java字节码

前言

为什么要阅读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               
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值