Java的虚拟机包含了很多芝士点,看起来也是一堆能压死人的内容>.<
既然一切皆对象,一切皆文件,那虚拟机里的类文件结构是必须了解的了。
都知道编程起源时,写代码是件相当费劲的事,因为要让机器“读”得懂,人得写机器码,后来发展到了高级编程语言,人写起来轻松一些,那机器就“读”不懂了,就需要中间来个“翻译机” —— Java虚拟机。
先来张镇楼图~
1. 语言无关性
不单单是Java语言,其它语言也可以被它“翻译”过去。 代码进来,字节码出去~
我们的口号是:“一次编写,到处运行!”
Write Once, Run Anywhere.
java不仅具有平台无关性,而且具有很强的语言无关性~
看图:
Java虚拟机并不在乎到底Class文件是怎么得来的,只要符合Class文件结构格式,就能在虚拟机中运行了。
那么class文件是什么格式的?
2. 神秘的class文件
用Studio找个Android的工程打开,在build目录的相应结构下随意找个.class文件,用文本工具打开看看~
暗号!
看花眼了?看看第一句是啥?
没看错,"cafebabe"! (Φ皿Φ) 这是什么暗号吗?!
key word
- 基础单位:8个字节
- 二进制流
(Class文件是一组以8个字节为基础单位的二进制流。)
好好看结构
再来对照看下
(1)Magic!
第一个值叫"magic",位于.class文件的头4个字节,就是前面看到的"cafebabe"~~~
很多文章翻译为“魔数”,其实它就是“暗号”,表明身份来的,和“黄河黄海,我是长江”来对身份一个道理 ~。~ 没有这个暗号,jvm就不认识惹!
-
唯一作用
就是确定这个文件是否是能够被虚拟机识别的class文件
-
值
是固定的"0xCAFEBABE"。
(2)版本号(4个字节)
魔数后面紧跟着的就是版本号了,包括次版本号和主版本号,各占2个字节。
例子中,是0000和0033,0000表示次版本号为0,0033表示主版本号为51。
(3)大名鼎鼎的常量池!(不定个字节)
谁说不知道常量池的,站出来,保证不打你~
可以理解为 Class 文件之中的资源仓库,它是Class文件中出现的第一个表类型数据类型,也是占用 Class 文件空间最大的数据项目之一。
常量池中的每一项常量都是一个表。
对应表里,u2类型,0x015a表示常量池所占字节数(要注意下,字节码的常量池是从1开始计数的)。
常量池中的每一个常量都是一个表,一共有11种表结构,他们具有共同的特征,就是第一个字节(u1)表示的是这种表的类型,接下来的字节根据他们各自的类型进行解析。
来反编译class看看~
(4) 访问标志(2个字节)
先来看访问标志都有什么,以及每个对应的16进制数是什么?