上次讲JVM概述的时候说到了它是一种规范,是能够执行任何编译成Class类型文件的语言。那么Class类型的文件又是什么呢?
什么是ClassFileFormat?
class文件全名称为Java class文件,主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。
该文件打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。
——《百度百科》
简言之就是我们的java文件通过jre编译后生成的用于在JVM上执行的后缀为.class的文件。
ClassFileFormat学习
总体来说它不算是个重点内容,对于开发工作来说了不了解都没什么大问题。但既然回来复习了,那就学的深入一些。先说总结,搞明白class文件类型能使你对开发语言的了解更加清晰,明白语言与汇编与机器的交互过程,还是比较有帮助的。
首先我根据自己理解用表格表达Class文件的结构:
写一份简单的java文件,代码如下:
public class TestClass01 {
}
build编译一下就生成了.class文件
打开这个文件,发现代码如下:
public class TestClass01 {
public TestClass01() {
}
}
其实这里并不是这个.class文件的实际内容,而是idea自动对它进行了反编译的结果。它自动为我们生成了一个构造方法是java的语言特性。
而实际中.class文件在notpad++中打开是这个样子的:这里我推荐IDEA的Binary插件将其转换为16进制如下图:
Class文件该怎么读
读class文件可以通过java自带的javap
命令来查看其内容结构,我推荐IDEA中的JClasslib
插件。首先将光标移动到类名,在View
中就可以看到Show Bytecode With jclass
的选项。
点开之后就会出现这个窗口,很直观的可以看到上面我说的Class文件的结构
然后我们反过来看Class文件的16进制,其中每两个字节为一组:
-
前两个字节为
magic num
,这个无需关注; -
后面第一个字节是
minor num
小版本号,第二个字节是major num
大版本号,转换为十进制就52对应我的jdk1.8; -
0010
指的是constant_pool_count
常量池里的常量数量,实际常量数为constant_pool_count-1
,这里就是15个。对应JClasslib中可以看到确实如此。
接下来就是对应后面的15个常量池的字节在JClasslib中查找对应的内容,根据其描述指向对应的实现内容可以查JAVASE官方文档。过程比较复杂繁琐我就不一一放图演示了。
虽说学习Class用处不大,但通过这几个步骤的操作能让我比较直观的了解到java编译后程序是如何实现的。
这种不是很重要的知识点我以后还是尽量少发表,记录比较繁琐耗费学习时间
以上是我对ClassFileForma的学习记录,主要为我的主观理解,若有错误请指出,欢迎与我评论交流~