我有一个Java类文件。如何找出用于编译此文件的编译器版本?我在Ubuntu Server 12.04上。

#1 楼

JDK包含一个javap命令。它提供了很多信息,但是您可以像这样使用它:

javap -verbose yourClass | grep version


示例输出:

  minor version: 0
  major version: 51


主要版本会告诉您编译器的版本:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45


评论


对于45,确切的编译器版本取决于次要版本。我相信45.3将是1.0.2。

–锑
13年4月15日在17:13

这实际上告诉您类文件格式的版本,而不是编译器或用于生成它的其他工具的版本。 javac支持-target或--release标志来生成针对JDK早期版本的类文件。

–大卫·菲利普斯(David Phillips)
18-12-29 at 3:50

除了代码,有没有办法获取版本?

–艾弗里
5月11日16:35

#2 楼

同样,file(1)实用程序和基于它的libmagic(3)也可以成为您的朋友:

$ file Gwan.class
Gwan.class: compiled Java class data, version 50.0 (Java 1.6)


评论


如果您使用Windows,该怎么办?

–avgvstvs
14年4月18日在13:55

@avgvstvs:然后您仍然可以使用Cygwin之类的东西。老实说,如果通过将RCE工作限制在单个主机OS上来限制自己的工具集,那是你自己的错。简而言之:基于任意和人为的限制,知道什么时候使用什么工具,不要挑剔。

– 0xC0000022L♦
2014年4月27日在18:24

Cygwin引入了不必要的依赖关系。如果要反转.class文件,则在每个JVM上,您都可以访问javap。我不会不同意您所说的其他内容,但是我很懒惰,如果我不必启动vm或d / l cygwin,我会更开心。

–avgvstvs
2014年4月27日在19:52

#3 楼

您正在命令行(对于名为MyClass的类)中进行查找:

在Unix / Linux上: :

javap -verbose MyClass | grep "major"


您需要结果的主要版本。以下是一些示例值:


Java 1.2使用主要版本46
Java 1.3使用主要版本47
Java 1.4使用主要版本48
Java 5使用主要版本49
Java 6使用主要版本50
Java 7使用主要版本51
Java 8使用主要版本52