深入理解JVM字节码
上QQ阅读APP看书,第一时间看更新

1.1 初探class文件

在计算机科学领域有一句名言,“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”, JVM就是在这样的背景下应运而生的。Java在设计之初就提出一个非常著名的口号:“一次编写,到处运行。”即Java编译生成的二进制文件能够在不做任何改变的情况下运行于多个平台。为了实现跨平台的目标,Oracle公司和其他虚拟机开发商为不同平台提供了不同的虚拟机运行环境。以JDK8为例,Oracle提供的不同操作系统的JDK实现如图1-1所示。

图1-1 不同操作系统JDK实现

Java是平台无关的语言,但JVM却不是跨平台的,不同平台的JVM帮我们屏蔽了平台的差异。通过这些虚拟机加载和执行同一种平台无关的字节码,我们的源代码就不用根据不同平台编译成不同的二进制可执行文件,Java平台无关性如图1-2所示。

图1-2 Java平台无关性

下面我们以输出“Hello, World”为例来开始class文件的探索之旅。新建一个Hello. java文件,如代码清单1-1所示。

代码清单1-1 Hello类源代码

        public class Hello {
            public static void main(String[] args) {
                System.out.println("Hello, World");
            }
        }

JDK中自带的javac命令可以将源文件编译成.class文件,在命令行中执行javac Hello. java命令,就可以生成Hello.class文件了。使用十六进制工具查看这个class文件,如图1-3所示。

图1-3 使用十六进制查看class文件

接下来会用大量的篇幅对class文件的结构进行详细剖析。