计算机比较“傻”,只认 0 和 1,这意味着我们编写的代码最终都要编译成机器码才能被计算机执行。Java 在诞生之初就提出了一个非常著名的宣传口号: "一次编写,处处运行"。
Write Once, Run Anywhere.
为了这个口号,Java 的亲妈 Sun 公司以及其他虚拟机提供商发布了许多可以在不同平台上运行的 Java 虚拟机,而这些虚拟机都拥有一个共同的功能,那就是可以载入和执行同一种与平台无关的字节码(Byte Code)。
(前面其实我们也讲过,但为了这篇内容的完整性,我们简单过一下,这一节我们的重点是通过 javap 这个命令来了解字节码)
有了 Java 虚拟机的帮助,我们编写的 Java 源代码不必再根据不同平台编译成对应的机器码了,只需要生成一份字节码,然后再将字节码文件交由运行在不同平台上的 Java 虚拟机读取后执行就可以了。
如今的 Java 虚拟机非常强大,不仅支持 Java 语言,还支持很多其他的编程语言,比如说 Groovy、Scala、Koltin 等等。
来看一段代码吧。
public class Main {
private int age = 18;
public int getAge() {
return age;
}
}
编译生成 Main.class 文件后,可以在命令行使用 xxd Main.class
打开 class 文件(前面我们已经讲过了,还不会用的同学可以回头看一眼)。
对于这些 16 进制内容,除了开头的 cafe babe,剩下的内容大致可以翻译成:啥玩意啊这......
但经过上一节类文件结构的洗礼,相信大家对这份文件的内容已经很熟悉了。
javap
Java 内置了一个反编译命令 javap,可以通过 javap -help
了解 javap 的基本用法。
当然了,执行这个命令的前提条件是你需要配置好 Java 环境变量,如果没有配置好,可以参考这篇文章。
javap 是 JDK 自带的一个命令行工具,主要用于反编译类文件(.class 文件)。我本机是 macOS,使用了 jenv 来管理的 JDK 版本,所以看到的位置如下图所示。
真诚点赞 诚不我欺
回复