我们都知道JVM能够识别的只有class格式的文件, 而源文件只是我们人能识别的, 不能被JVM识别。 那我们要在更深的层次上理解Java语言, 理解JVM, 只懂源文件是不够的, 因为虚拟机的很多的行为, 是在class文件中定义的, 而我们要理解JVM的行为, 就必须也学会JVM能理解的“语言”, 那就是class文件格式 。 就像我们想要深入的了解一个外国人, 只站在自己的角度上是不可能了解他的, 只有你学会了他的语言, 才能对他更了解, 因为只有你理解了他说的话, 才能知道他做的事, 进而了解他的行事方式和性格特点。 当然, 也有另外一个方式可以让你了解外国人, 那就是让他学会中国话, 你们用中文交流。 但是在Java的世界里, 这是不可能的, 因为你不可能让JVM识别源文件, 所以, 只能你去学习JVM能理解的语言 ---- class文件。
理解了class文件的格式, 不仅对理解JVM的行为有指导性的意义, 它还能让我们对Java代码有更加清晰深刻的认识, 毕竟class文件是由我们写的java代码“翻译”过来的。 明白了class文件的格式, 你就能知道方法是如何表示的, 字段是如何表示的, 继承是如何表示的 , 方法体是如何表示的, 等等。 所有源文件中的东西, 都会在class文件中有相应的描述形式。 这样会让我们在写代码时做到胸有成竹。 当代码出了问题时, 也能更快的找出原因所在,因为我们可以把源码生成的class文件反编译出来, 看看它内部是如何实现的。 毕竟原理明白了, 源代码只是表象罢了。
此外, class文件不只是可以由Java代码生成。 其他很多基于JVM的语言, 也是生成标准的class文件, 然后被虚拟机执行。 如我最近正在学习的scala语言, 它就是基于虚拟机的。 scalac编译器可以将scala代码编译成class文件。 这样的话, 了解class文件格式, 可以对学习其他基于JVM的语言起到很好的作用, 你会发现, 如果你对class文件和JVM足够了解的话, 学习这些语言会感到非常轻松。 class文件是JVM的一个接口, 不管你源文件中写的是什么代码, 不管是java还是scala, 只要通过一定的方式, 让你写的代码可以转化成格式正确的class文件, 那么JVM就能替你执行。 如果你足够牛, 完全可以自己创建一门语言, 实现一个针对这个语言的编译器, 将之编译成class, 那么虚拟机也能执行, 并且Scala,Groovy等语言的设计者已经在这么干了。