弱鸡绿毛怪
本帖最后由 MagicLocyDragon 于 2018-4-30 12:05 编辑

前言

众所周知,当一个不符合你jre版本不对的类加载进jvm时,会抛出异常:
java.lang.UnsupportedClassVersionError
报错信息大概如下:
Unsupported major .minor version 52.0   
其中,粗体字(52)我们称为这个类的主要版本(major version) 小数点后面的成为Minor Version(次要版本)


主要版本(major version)

主要版本在jvm检测你的类的版本时起到重要的作用。若这个主要版本不符合你的jre版本,jvm将会抛出如上异常。
各个jre版本的范围: 版本号从45开始
如jre1的范围就是 45.0~45.65535
jre2的范围就是 45.0~46.65535
jre3的范围就是 45.0~47.65532
规律:依次加一
那么jre8的范围就是 45.0~52.65532
而前言中的类的版本号 是52.0 ,也就是只有jre8才能运行该类


如何看某个类(class文件)所支持的版本呢?

这里我们用WinHex随便打开一个class文件,查看该class文件的十六进制:

其中这个位置:

就是该类的主要版本,就是我圈出来的30,但是这个30是十六进制的,转换为十进制就是:
48
也就是最低能够支持jre4!(jre4的范围是45.0~48.65535)
所以该类在jre4以下的版本运行就会报错,报错信息设想如下:
java.lang.UnsupportedClassVersionError
Unsupported major .minor version 48.0


魔数(Magic Value)

很多的文件的开头都会有一个魔数,这是识别该文件是一个可以正常运行的文件的一个准则。比如java的class文件的魔数特别好玩,设置成了CafeBabe:

当然CafeBabe这个命名也是有一个故事的,大概是什么我也忘记了。
也就是说,如果一个文件并没有CafeBabe这个魔数,但是想要载入jvm,这是不允许的。
来自群组: SpicyChicken

3TUSK
其中,粗体字(52.0)我们称为这个类的主要版本(major version)

Major Version 只是那个 52。那个点后的 0 是它的 Minor Version。所以它写的是 "Unsupported major.minor version"。

当然CafeBabe这个命名也是有一个故事的,大概是什么我也忘记了。


James Gosling(詹姆斯·高斯林,Java 的共同创始人之一)对此表示负责。
参考来源:https://stackoverflow.com/questi ... ile-format-cafebabe

弱鸡绿毛怪
u.s.knowledge 发表于 2018-3-31 14:48
Major Version 只是那个 52。那个点后的 0 是它的 Minor Version。所以它写的是 "Unsupported major.minor ...

是的

第一页 上一页 下一页 最后一页