00:01
那讲完魔术之后啊,咱们来看下个结构,下个呢我们称为呢叫class文件的版本号,诶class文件的一个版本号什么意思?嗯,在魔术四个字节之后啊,我们说还有四个字节,这四个字节呢,我们又分成五六,哎然后一组七八,一组五六呢表示的呢叫做manner这minor version,然后七八呢代表的叫a major version,哎这个呢我们称为呢叫副版本,这个呢称为呢叫主版本,也可以呢把它称为呢叫小版本,它称为呢叫做大版本。啊,是这个意思来,我们还是以咱们说的这个DEMO为例,是吧?哎,咱们DEMO的这个自节码文件啊,啊以它为例,咱们就还是在这个Excel里边来看,那第五位跟第六位它俩呢构成的叫做啊manner version,这个我们用一个比较浅的一个绿色来表示。啊,这个呢,我们叫,哎,我写成那个中文了哈,叫做副版本。哎,副版本好,然后呢在随后,哎,我们这两位呢,合在一起称为呢,叫做主版本啊,我用一个颜色比较深的一个啊绿色来表示。
01:03
哎,主版本啊,叫做major卧室。好,主版本跟副版本,注意它并不是我们所谓的一个是呃,这个区间的左侧,一个是区间的右侧,不是这样子的,他们是这样来组合的,比如说主版本呢,是大的M,副版本呢是小的M,但我们当前这个class文件它编译的时候,诶使用的这个前端编译器啊,或者说我们换句话呢,就是我们JDK这个版本是什么呢?哎,是它们俩合并在一起啊,是大M点小M这个方式来构成的。那举个例子啊,在咱们这个JDK1.1的时候呢,呃,主版本呢是45,副版本呢是三,那也就构成了45.3。那么45.3呢,对应的就是我们JDK1.1的这个版本,那之后这个版本大家也看到我们这个,呃,表格里边写的,那在后续的这个版本当中啊,我们发现这个副版本呢,就全是零了,这个主版本呢,就是每增加一个JDK的版本,我们这个主版本呢,就增加一个数值,哎,就是这样的一个关系,那比如说呢,我们用的这个JDK1.8 1.8呢,我们对应的这个数值呢,就是52。
02:09
啊,那有的同学可能会看到,哎,我们这块呢,这不是34嘛,注意这个时候我们用的是不是16进制啊,那16进制的34实际上对应的就是哎十进制的啊,我们的这个52啊,怎么来看呢,这个呢,咱们是不是还可以用咱们上午诶提到的一个工具对吧,这个工具的话呢,就是我们直接点开这叫bary river啊。打开之后呢,咱把咱的这个demo.class呢给他拖进去。拖进之后呢,这时候我们看到这个34,你这个一点,然后在右边这块呢,十进制,那就是52对吧?哎,那这52呢,相当于就是我们这个JDK8这样的一个版本,对应的编辑器呢,我们实现了一个编译,这个字有点小,咱们可以给它稍微放大一点。啊,比如说改成这个12是吧,来确定一下。
03:00
嗯,行这样就可以了啊,行这呢,就是我们说的这个事情,那这里边儿我们想给大家强调的点是什么呢?就是虽然啊,咱们想说JDK这个版本啊,嗯,一个一个往上递增是吧,往上递增的过程当中啊,咱们这个class文件的这个结构。Class文件的这个结构呢,基本上是不变的,包括呢,我们说常见的一些自解码指令,也是咱们下一章当中重点要讲解的啊,就是我们所谓的这边我们看到的这些啊,这就叫做解码指令啊,这个操作码和操作数对吧?这个呢,基本上随着JDK版本的变化呢,他们变化也不大啊,变化也不大,但是呢,注意我们每这个升一个版本,或者你在一个新的版本下呢,进行一个编译的话呢,我们这个主版本这块呢,是肯定要变的了。那这个大家一定要小心一下啊,这是我们要关注的一个问题。好,也就是说我们每升级一个GT版本,我们的这个,诶,编译器的这个版本主版本啊,都是做一个变化啊,这个从之后呢,就是增加个一嘛。
04:01
呃,那这里边我们需要讲这个事儿注意的问题是什么呢?呃,这里边提到一个兼容性的问题,说不同版本的障碍编译器编译的自解码文件啊,对应的版本呢,是不一样子的,显然对吧?那么高版本的Java虚拟机可以执行由低版本编译器生成的class文件,但是低版本的Java虚拟机呢,不能够执行高版本编译器生成的class文件,否则呢,会包这样的一个error。啊,这个呢,简单来说就是我们平时强常强调的一个草上叫做向下兼容对吧。啊,这个话的话呢,你看挺长的,但是其实这个事儿呢,不太难理解,那我们来以实际的例子呢,来给大家做一个说明啊,比如说呢,就咱们说的这个string test对吧,那这个string test当前我们看一下啊,比如我们看这块啊,这个整体结构,这个product呢,咱们现在都是1.8,哎,Module呢,咱们这个CAPTURE01第一章的话呢,也是这个JDK8对吧,整个在八的这样一个环境下,OK,我们这时候呢,做一个。
05:04
啊re啊,重新做一个编译。那编译之后呢,就会生成我们这个叫呃自解码文件。哎,打开我们这个叫,哎,Java里边的string test对吧,就它啊,然后把它呢,比如我们CTRLC一下。这呢,我把它CTRLV啊粘到咱们这个桌面上,我使用这个,嗯,动态加加呢给它打开。好,这时候呢,我们看到就是34,那就意味着这也是对应的是52是吧?哎,16进制对应的这个十进制呢,就是52,那52的话呢,翻回来,那这不就是对应的我们这个呢,叫JDK一点儿八嘛。对吧,那现在呢,我们就比如说是当前这样的一个文件。那刚才我们看到这个红色的文字想表达的意思是什么呢?就是如果我们现在使用的JDK的版本啊,JDK的版本,那用的是什么呢?那咱们平常这块啊,这个我CMD一下好问二。
06:01
Java,哎,杠。哎,Version是吧,现在呢,我们这个配的帕黄金变量啊,我用的呢也是JDK1.8,但是如果说我这块呢,改成是JDK1.6的话啊,如果改成G个1.6,我们去,呃解释运行咱们这个自解码文件,它就会失败,相当于你在一个低版本的账号虚拟上去运行一个高版本的自节码文件,这个是失败的,那反之的话呢,如果我们这个JDK的啊,这个版本呢,是1.8以上的,比如说是01:11对吧,我们呢,就可以去运行这个低版本编译器编译出来的这个资形码文件,因为你这是1.8嘛。对吧,哎,就是这样的一个道理,哎,就是这样的道理啊,那我们给大家演示一个这样的一个事情。演示一下这样事情,那演示这个事情的话呢,我们可以通过不同的方式都可以给大家去做一个展示哈,那我们可以这样来演示,比如说我现在呢,在这个位置去修改一下啊,或者我们就直接在idea里边给大家演示吧,呃,Idea里边演示可以这样啊,咱们当前你看啊,咱们编译以后的这个是不是这个1.8的对吧?啊好,然后我在这个run这块呢,有一个叫edit configurations打开。
07:12
打开以后你看这个GRE,咱们这也是1.8是没问题的啊对吧,那我现在呢,把它改成是一个1.6的。啊,我改成1.6的一个运行环境啊,然后我做个应用啊,针对就是我们这个spring test啊,然后OK,那就意味着咱们当前这个资金码文件是52对应的是1.8,我想在1.6上呢去做运行,大家做一个执行看看。好,此时的话呢,你看他就报错了,哎,这不就按ported class motion error啊说当前呢,不支持或者哎不支持你这个版本啊,我们支持的最低版本呢,得是52。哎,就相当于得是这个1.8的是吧,哎,那我们现在呢,用的这个,呃,是JDK6嘛,相当于咱们当前呢。哎,六这块呢,咱用的是一个50嘛。
08:01
你相当于是在50的这个主版本上呢,你想运行52是不行的是吧,咱这块要求的说你最低的你得是一个五十五五十二对吧,是这个情况啊,那我们再改一下,比如说呢,我在这个run。啊,我把它呢,改成是一个11的。啊,那显然呢是OK的对吧,啊做一个OK。啊,我们再做一个执行。诶,你看这时候呢,它就没有问题啊,相当于我们1.8的这样的一个资金码文件,在呃JAVA11的这个虚拟机上,我们做一个运行是OK的啊行,这块呢,我们就这样做个展示啊,当然呢,大家你也可以怎么着呢,就是呃,在咱们的这个呃命令行呢,去做一个演示也是OK的啊这呢我就不过多的去演示这个问题了啊,这个事儿呢,也比较容易的说清楚啊就行。呃,那这里边接下来我们要注意一个问题是什么呢?就是在实际应用当中啊,大家一定要小心,咱们开发环境和实际的生长环境,有可能呢,大家用的这个这个版本呢,是不一样子的,所以呢,一定要规避这个问题啊,就是别出现了我们这个版本不一致,出现我们对应的这样的error问题啊就可以了,好,下边就是我们说的对应的这个呃版本这个包含的这个具体的范围啊,这个也很好的,容易去理解啊,JDK一点几,比如我们是呃01:11啊,01:11对应的就这。
09:18
啊,那这个数怎么算呢?就是45到这个是11嘛,哎,11对应的这个呢,就是55啊,就是这个55在这个范围之内的,哎,Class文件我们都是可以解析的,就是高版本的虚拟机可以解释运行低版本的自解码文件啊就这样的一句话啊,记住它就可以了。
我来说两句