如何查看Class文件编译的JDK版本?

Python039

如何查看Class文件编译的JDK版本?,第1张

在jar包中,用winrar解压一个类文件,然后在命令行下面输入\x0d\x0ajavap -verbose classname\x0d\x0a会输出一些信息,大致如下:\x0d\x0a\x0d\x0aCompiled from "HtmlCrawer.java"\x0d\x0apublic class org.eagleeye.html.HtmlCrawer extends java.lang.Object\x0d\x0a SourceFile: "HtmlCrawer.java"\x0d\x0a minor version: 0\x0d\x0a major version: 50\x0d\x0a Constant pool:\x0d\x0aconst #1 = class #2// org/eagleeye/html/HtmlCrawer\x0d\x0aconst #2 = Asciz org/eagleeye/html/HtmlCrawer\x0d\x0aconst #3 = class #4// java/lang/Object\x0d\x0aconst #4 = Asciz java/lang/Object\x0d\x0aconst #5 = Asciz client\x0d\x0a....\x0d\x0a\x0d\x0a后面省略了,可以看到前面有两行:\x0d\x0aminor version: 0\x0d\x0amajor version: 50\x0d\x0a表示了类文件的版本

首先用一些二进制查看器打开class文件,比如od或者hexdump工具。

od -x hello.class

或者

hexdump hello.class

我们会看到类似于下面的输出:

feca beba 0000 3300

这里我们看到前四个字节是Java class的特殊符号,叫做magic字段,用来告诉JVM这是个class文件,之后的两个字节是minor版本号,再之后的两个字节是major版本号,我们看到时33,对应下表我们知道33时JDK1.7编译的版本号。

十六进制

JDK1.5 31

JDK1.6 32

JDK1.7 33

JDK8 34

因为Java是向后兼容的,所以高版本的兼容低版本的,所以有时候你遇到java报: unsupported major.minor version 51,那就是你用低版本的虚拟机去运行高版本JDK编译的class文件了,所以低版本的虚拟机就抱怨了。这里的51是十进制,也就是十六进制的33,及对应JDK1.7,如果出现这种错误,你肯定是使用低于1.7版本的虚拟机去运行这个了。

查看class文件编译的jdk版本步骤如下:

首先打开cmd命令行窗口,输入如下指令:

会输出一些信息,大致如下:

Compiled from "HtmlCrawer.java"

public class org.eagleeye.html.HtmlCrawer extends java.lang.Object

SourceFile: "HtmlCrawer.java"

minor version: 0

major version: 50//这个便是jdk的版本信息。

jdk的版本可以参考如下对照表: