到此,所有关于class文件格式的重要内容都已经讲解完了,不敢说面面俱到,但是敢说大部分重要的内容都包含在内了。前前后后用了9篇博客来专门讲解class文件结构,为什么花那么多的时间和精力来介绍class文件呢?简而言之,因为它很重要。在前面的文章中,也讲到过为什么对于理解Java体系结构来说,理解class文件的格式至关重要。其实这篇短文也不是对class文件格式细节上的总结,而是我在学习class文件和JVM的过程中的一些感悟和理解
我们都知道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等语言的设计者已经在这么干了。