Java类文件格式的主要版本号列表?

我在另一篇文章中看到了Java的主要版本号列表:

< span style=" font - family:宋体;"Java > < / th > < span style=" font - family:宋体;"> < / th >主要版本 < span style=" font - family:宋体;"19 > < / td > < span style=" font - family:宋体;"道明> > 63 < / < span style=" font - family:宋体;"> 18道明> < / < span style=" font - family:宋体;"道明> > 62 < / < span style=" font - family:宋体;"> 17道明> < / < span style=" font - family:宋体;"道明> > 61 < / < span style=" font - family:宋体;"16道明> < / > < span style=" font - family:宋体;"> 60道明> < / < span style=" font - family:宋体;"> 15道明> < / < span style=" font - family:宋体;"59 > < / td > < span style=" font - family:宋体;"14道明> < / > < span style=" font - family:宋体;"> 58 td > < / < span style=" font - family:宋体;"13 > < / td > < span style=" font - family:宋体;"> 57道明> < / < span style=" font - family:宋体;"> 12道明> < / < span style=" font - family:宋体;"道明> > 56 < / < span style=" font - family:宋体;"11道明> < / > < span style=" font - family:宋体;"55 > < / td > < span style=" font - family:宋体;"10 > < / td > < span style=" font - family:宋体;"> 54道明> < / < span style=" font - family:宋体;"9 > < / td > < span style=" font - family:宋体;"> 53道明> < / < span style=" font - family:宋体;"> 8道明> < / < span style=" font - family:宋体;"> 52道明> < / < span style=" font - family:宋体;"7 > < / td > < span style=" font - family:宋体;"51 > < / td > < span style=" font - family:宋体;"6 > < / td > < span style=" font - family:宋体;"> 50道明> < / < span style=" font - family:宋体;"5 > < / td > < span style=" font - family:宋体;"49 > < / td >
48道明> < /
< span style=" font - family:宋体;"> 47道明> < /
< / td >

这个列表从何而来?有具体的参考吗?最好还能显示小版本?

333016 次浏览

这些来自于类版本。如果你试图在java 5运行时加载一些java 6编译的东西,你会得到错误,不兼容的类版本,得到50,预期49。或者类似的东西。

更多信息请参见字节偏移量为7的在这里

附加信息也可以在在这里中找到。

我在维基百科页面上找到了Java类文件版本的列表,描述了类文件的格式:

< a href = " http://en.wikipedia.org/wiki/Java_class_file General_layout " > http://en.wikipedia.org/wiki/Java_class_file General_layout < / >

下字节偏移量6 &7、列出了与哪个Java VM对应的版本。

如果你遇到了关于“类文件的错误编译器”的问题,可以通过Eclipse将项目的JRE更改为相应的JRE来解决这个问题。

  1. 构建路径
  2. 配置生成路径
  3. 将库更改为朋友最后显示的表对应。
  4. 创建“jar文件”并编译并执行。

我这样做了,而且成功了。

如果你在build/com/foo/Hello.class中有一个类文件,你可以使用命令检查它是在哪个java版本编译的:

javap -v <path to class file> | grep "major"

使用示例:

$ javap -v build/classes/com/example/Book.class | grep major
  

major version: 57

根据OP中的表,主版本57意味着类文件被编译到JDK 13字节码级别

主要版本号的正式来源:

Java SE 19虚拟机规范,第4章。类File Format

JVM规范的最新发表版本可以在在这里中找到。

我在类的.lessfilter中使用javap,所以我可以反编译并直接知道它们是用什么版本编译的

*.class)
echo "/** "
javap -verbose "$1" | grep version | sed -e 's/50/Java6/' -e 's/51/Java7/' -e 's/52/Java8/' -e 's/53/Java9/' -e 's/54/Java10/' -e 's/55/Java11/' -e 's/56/Java12/' -e 's/57/Java13/'
echo " **/"
java -jar ~/bin/cfr-0.150.jar "$1" | enscript --color --language=ansi --highlight=java -o - -q
;;

(试图作为注释添加到之前的答案,但无法获得格式化的代码,并认为这可能对其他人有用)

(实际上是一个扩展的评论而不是一个回答..)

问题是关于“版本的列表来自哪里”。

这个问题在这种反应中得到了回答,它引用了JAVA SE规范:class文件格式”;。似乎这是相当权威的(它也在维基中引用字节6(主版本)值),并且应该是可接受的答案。


有几个答案似乎集中在如何使用javap确定值或不使用它。这些应该是独立的问题。然而,unix命令file是查找版本的非javap方法。file读取在类文件结构中指定的magic

即:file myClass.class,或更优雅的file -b myClass.class | awk -F',' '{print $NF}'

例如:

$ find * -name "*.class" -exec file -b {} \; | awk -F',' '{print $NF}' | sort -u
version 45.3
version 50.0 (Java 1.6)
version 52.0 (Java 1.8)