java虚拟机之class文件说明
2017-01-21 本文已影响17人
吴世浩
一、背景
今天修改一个比较旧的代码,jdk1.5的项目,所以编译需要1.5的jdk,但是我从1.7上切会1.5的时候编译后的代码还是1.7的,也就是查看到二进制码0033,最后才发现是下面这里没改造成的。顺便也记载下class文件结构
二、问题
![](https://img.haomeiwen.com/i1456372/6d4ac32176cf6be2.png)
这里的编译级别没有进行修改早餐的
查看代码的jdk版本方式,直接用文本打开class如下图所示
![](https://img.haomeiwen.com/i1456372/98b7c706747ee77e.png)
jdk版本对应的部分型号如下
34(对应十进制的50):JDK1.8
33(对应十进制的50):JDK1.7
32(对应十进制的50):JDK1.6
31(对应十进制的49):JDK1.5
idea中我电脑配置的是1.8的jdk,可是编译后的一直是1.7的效果
![](https://img.haomeiwen.com/i1456372/a6ff3c6a1be822de.png)
然后在启动tomcat报错如下:
![](https://img.haomeiwen.com/i1456372/9884dd4d7642da48.png)
最后在配置tomcat的页面:
![](https://img.haomeiwen.com/i1456372/e415180e18e34a29.png)
这里有个jre的选项,本地是1.8的环境,编译的class是1.7的,但是怎么会报错了,高版本应该兼容低版本的。不过把这里改成1.8的就好了
三:class文件说明
3.1 class开头0-4
class文件的头4歌子节称为魔术,他的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。使用魔数不是拓展名来进行识别主要是基于安全方面的考虑,因为文件的拓展名可以随意地改动。
3.2 5-8位意义
5-8位是Class文件的版本号,第5和第6字节是此版本号,第7和第8字节是主版本号。
四:浩语
__
__ _ ____ __| |__ _____ ___
\ \/ \/ / | \ | \\__ \ / _ \
\ /| | / Y \/ __ \( <_> )
\/\_/ |____/|___| (____ /\____/
\/ \/
任何事情都是要靠努力和用心。