如何检查用于编译.class文件的jdk版本

Cha*_* Ma 281 java

可能重复:
读取和显示Java .class版本的工具

我正在尝试调试

".class文件中的版本号错误"

java中的错误,有没有办法让我检查.class文件是哪个版本的?

我正在使用JRE1.5.0_6,但我JDK的版本是1.6.0_13.

我在eclipse中编译兼容模式设置为1.5,我认为这样可行...

Joh*_*eek 610

你在命令行上寻找这个(对于一个名为MyClass的类):

在Unix/Linux上:

javap -verbose MyClass | grep "major"
Run Code Online (Sandbox Code Playgroud)

在Windows上:

javap -verbose MyClass | findstr "major"
Run Code Online (Sandbox Code Playgroud)

您想要结果中的主要版本.以下是一些示例值:

  • Java 1.2使用主要版本46
  • Java 1.3使用主要版本47
  • Java 1.4使用主要版本48
  • Java 5使用主要版本49
  • Java 6使用主要版本50
  • Java 7使用主要版本51
  • Java 8使用主要版本52
  • Java 9使用主要版本53
  • Java 10使用主要版本54
  • Java 11使用主要版本55

  • 或者,如果您在十六进制编辑器中打开类文件,则可以查看字节7和8.该数字将映射到上面答案中给出的数字.例如`00 2E` - > JDK 1.2 = 46(0x2E十六进制).如果您无权访问javap,则非常有用.参考:http://en.wikipedia.org/wiki/Java_class_file#General_layout (43认同)
  • 附录:你可以把-cp <jar>然后放到类中,这样你就可以从现有的jar中获取它 (17认同)
  • 我不得不删除命令中的".class",否则我收到一条消息,"错误:找不到foo.class".这样做,"javap -verbose foo | grep"major""起作用了.只是一个抬头.http://stackoverflow.com/questions/13356811/java-javap-errorcould-not-find-class (2认同)
  • 正如Jim所建议的,对于vi上瘾者:“ vi MyClass”然后是“ &lt;Esc&gt;:!xxd”,然后是第8个字节。0x31、0x32、0x33、0x34、0x35分别代表Java 5、6、7、8、9。“ &lt;Esc&gt;:q!” 退出vi。 (2认同)

Sea*_*lly 15

顺便说一下,你遇到麻烦的原因是java编译器识别出两个版本标志.有-source 1.5,它假设java 1.5级源代码,-target 1.5,它将发出java 1.5兼容的类文件.你可能想要使用这两种开关,但你肯定需要-target 1.5; 尝试仔细检查eclipse正在做正确的事情.


Gwy*_*ans 7

这里免费的JarCheck工具


mar*_*def 5

你可以试试jclasslib:

https://github.com/ingokegel/jclasslib

它可以将自己与*.class扩展相关联,这很好.