Java VM里的magic

Java的虚拟机包含了很多芝士点,看起来也是一堆能压死人的内容>.<

既然一切皆对象,一切皆文件,那虚拟机里的类文件结构是必须了解的了。

都知道编程起源时,写代码是件相当费劲的事,因为要让机器“读”得懂,人得写机器码,后来发展到了高级编程语言,人写起来轻松一些,那机器就“读”不懂了,就需要中间来个“翻译机” —— Java虚拟机。

先来张镇楼图~

1. 语言无关性

不单单是Java语言,其它语言也可以被它“翻译”过去。 代码进来,字节码出去~

我们的口号是:“一次编写,到处运行!”

Write Once, Run Anywhere.

java不仅具有平台无关性,而且具有很强的语言无关性~

看图:

扫描二维码关注公众号,回复: 6592258 查看本文章

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进制数是什么?

参考

  1. JAVA 虚拟机入门(1)----- 类文件结构
  2. 从字节码层面看“HelloWorld”

转载于:https://juejin.im/post/5d070b0af265da1b8a4f1d1f

猜你喜欢

转载自blog.csdn.net/weixin_33834075/article/details/93183512