为什么在.class文件开头需要一个魔数?

13

我在这里阅读了一些关于每个Java.class文件开头的魔数0xCAFEBABE的帖子,并想知道为什么需要它- 这个标记的目的是什么?
现在是否仍然需要它?或者现在只是为了向后兼容而存在?

在这里我没有找到回答这个问题的帖子,也没有在Java 规范中看到答案。


1
你为什么关心.class文件里面有什么?.class文件是编译后的,你只需要关心.java文件就可以了。 - Nik
1
是的,虚拟机不需要这样做,只是为了能够区分Java类文件和其他类型的文件而添加的,即使文件名未知。(但它并没有被虚拟机用于此目的。) - Paŭlo Ebermann
2
@Nik - 这是一个出于兴趣的问题 - 我遇到了一个我不熟悉的术语,阅读了相关资料后仍感到困惑。并不是说我现在要编写一个.class文件解析器... - RonK
2
@Nik 如果你对字节码的读取和/或操作感兴趣,那么你一定会对 .class 文件非常感兴趣。 - jbranchaud
4个回答

10

魔数基本上是文件格式的标识符。例如,JPEG始终以FFD8开头。这不是Java本身所必需的,它只是有助于识别文件类型。您可以在此处阅读更多关于魔数的信息


如果Java不需要它,那么为什么当.class文件不是真正的类时会出现“Bad magic number”错误? - RonK
1
@RonK:这是一项额外的健全性检查。每个Java编译器都会在类文件前面放置正确的魔数,如果缺失了,就说明有问题。有点像校验和,但我不太喜欢这个比较。 - Demento

4
请查看: http://www.artima.com/insidejvm/whyCAFEBABE.htmlhttp://radio-weblogs.com/0100490/2003/01/28.html 以下是一些解释:
- 他们需要选择一个魔术数字来标识类文件,而只使用字母A-F时可以想到的Java或咖啡相关单词数量有限,所以他们选择了CAFEBABE。 - 为什么魔术数字是3405691582(0xCAFEBABE)?我的猜测是(a)32位魔术数字更容易处理并且更有可能是唯一的,(b)Java团队希望得到一个与Java-coffee隐喻相关的东西,而十六进制中没有'J'或'V',于是选择了带有CAFE的东西。我猜他们认为“CAFE BABE”比“AFABC AFE”或“CAFE FACE”更性感,绝对不喜欢“CAFE A FAD”(或更糟糕的是,“A BAD CAFE”)的含义。 - 如果你把十六进制的零读作字母'O',那么他们也可以使用数字12648430,从而得到0xC0FFEE或0x00C0FFEE来指定所有32位。OO COFFEE?当然是面向对象的... :-) - 我最初看到0xCAFEBABE是NeXTSTEP使用的一个魔术数字。NX使用“fat binaries”,它们基本上是不同平台的二进制文件粘在一起形成一个可执行文件。如果你在NX Intel上运行,它将运行Intel二进制文件;如果在HP上运行,则运行HP二进制文件。0xCAFEBABE是用于区分Intel或Motorola二进制文件的魔术数字(我记不清是哪个了)。

3

魔数(Magic numbers)是一种常见的技术,用于使文件等东西可识别。

其思想是只需读取文件的前几个字节,就能知道这是否很可能是Java类文件。如果前几个字节不等于魔数,则可以确定它不是有效的Java类文件。


2

在二进制文件中,通常会在开头加上一些固定标识符(例如zip文件以字符PK开头)。这样可以减少将错误类型的文件误解释为类文件的可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接