探索Java的DNA-JVM字节码深度解析


引言

在Java的世界里,JVM(Java虚拟机)是我们程序运行的心脏。而字节码,作为JVM的血液,携带着程序的执行指令。今天,我们将深入探索Java字节码的奥秘,一窥JVM如何将人类可读的代码转化为机器可执行的指令。


一、JVM 知识回顾


JVM是一个可以执行Java字节码的虚拟计算机,它包括类加载器、运行时数据区、执行引擎等核心组件。JVM架构保证了Java程序的平台独立性,实现了“一次编写,到处运行”的理念。

关于Java虚拟机的工作原理、作用和应用场景, 感兴趣的朋友请前往查看:Java虚拟机揭秘-底层驱动力,性能保障!


二、Class文件结构


Class文件是JVM执行字节码的载体,它以8位字节为基础单位的二进制流形式存在。Class文件的结构包括魔数、版本号、常量池、字段表集合、方法表集合等。

在这里插入图片描述


下面以一个例子逐步讲解字节码。

//Test.java
public class Test {
    
    private int a;
    
    public int num() {
        return a + 1;
    }
}

通过执行以下命令, 可以在当前所在路径下生成一个Test.class文件。

javac Test.java

以文本形式打开Test.class文件,内容如下:

cafe babe 0000 003d 0013 0a00 0200 0307
0004 0c00 0500 0601 0010 6a61 7661 2f6c
616e 672f 4f62 6a65 6374 0100 063c 696e
6974 3e01 0003 2829 5609 0008 0009 0700
0a0c 000b 000c 0100 0454 6573 7401 0001
6101 0001 4901 0004 436f 6465 0100 0f4c
696e 654e 756d 6265 7254 6162 6c65 0100
036e 756d 0100 0328 2949 0100 0a53 6f75
7263 6546 696c 6501 0009 5465 7374 2e6a
6176 6100 2100 0800 0200 0000 0100 0200
0b00 0c00 0000 0200 0100 0500 0600 0100
0d00 0000 1d00 0100 0100 0000 052a b700
01b1 0000 0001 000e 0000 0006 0001 0000
0002 0001 000f 0010 0001 000d 0000 001f
0002 0001 0000 0007 2ab4 0007 0460 ac00
0000 0100 0e00 0000 0600 0100 0000 0700
0100 1100 0000 0200 12

  • 文件开头的4个字节(“cafe babe”)称之为 魔数,唯有以"cafe babe"开头的class文件方可被虚拟机所接受,这4个字节就是字节码文件的身份识别。

  • 0000是编译器jdk版本的次版本号0


三、反编译字节码文件


使用 javap 命令反编译 Java 字节码文件是一个查看 .class 文件内部结构和字节码指令的简单方法。

用法: javap <options> <classes>

其中<options>选项包括:

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

以下是如何使用 javap 命令的基本步骤:

  • 第一步,编译 Java 源文件: 首先,你需要有一个 .class 文件。如果你有一个 .java 源文件,可以使用 javac 命令将其编译成 .class 文件。例如:
javac Test.java

这将在当前目录下生成一个名为 Test.class 的字节码文件。

在这里插入图片描述


  • 第二步,使用 javap 命令: 打开命令行工具(在 Windows 上是 CMD 或 PowerShell,在 macOS 或 Linux 上是 Terminal),然后使用 javap 命令查看 .class 文件的内容。

    可以使用:

    javap -c Test
    

  • 第三步,查看输出: 执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w风雨无阻w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值