阅读和显示Java .class版本的工具

你们有没有人知道一个工具,将search.class文件,然后显示他们的编译版本?

我知道你可以单独在hex编辑器中查看它们,但是我有许多类文件可以查看(由于某种原因,我的巨大应用程序正在编译为Java6)。

使用JDK附带的javap工具。 -verbose选项将打印类文件的版本号。

 > javap -verbose MyClass Compiled from "MyClass.java" public class MyClass SourceFile: "MyClass.java" minor version: 0 major version: 46 ... 

只显示版本:

 WINDOWS> javap -verbose MyClass | find "version" LINUX > javap -verbose MyClass | grep version 

读取类文件签名并获取这些值不需要第三方API是很容易的。 所有你需要做的是读取前8个字节。

 ClassFile { u4 magic; u2 minor_version; u2 major_version; 

对于类文件版本51.0(Java 7),开头字节是:

 CA FE BA BE 00 00 00 33 

…其中0xCAFEBABE是魔术字节,0x0000是次要版本,0x0033是主要版本。

 import java.io.*; public class Demo { public static void main(String[] args) throws IOException { ClassLoader loader = Demo.class.getClassLoader(); try (InputStream in = loader.getResourceAsStream("Demo.class"); DataInputStream data = new DataInputStream(in)) { if (0xCAFEBABE != data.readInt()) { throw new IOException("invalid header"); } int minor = data.readUnsignedShort(); int major = data.readUnsignedShort(); System.out.println(major + "." + minor); } } } 

步行目录( 文件 )和档案( JarFile )寻找类文件是微不足道的。

Oracle的Joe Darcy的博客列出了JDK版本映射到Java 7的类版本 :

 Target Major.minor 1.1 45.3 1.2 46.0 1.3 47.0 1.4 48.0 5 (1.5) 49.0 6 (1.6) 50.0 7 (1.7) 51.0 8 (1.8) 52.0 9 53.0 

在类Unix上

 文件/path/to/Thing.class 

将提供文件types和版本。 以下是输出结果:

编译的Java类数据,版本49.0

如果你在unix系统上,你可以做一个

 find /target-folder -name \*.class | xargs file | grep "version 50\.0" 

(我的版本的文件说java6类的“编译的Java类数据,版本50.0”)。

还有另一个java版本的检查

 od -td -j 7 -N 1 ApplicationContextProvider.class | head -1 | awk '{print "Java", $2 - 44}' 

在日食中,如果你没有附加源代码。 注意附加源button之后的第一行。

//从CDestinoLog.java编译( 版本1.5:49.0,超级位

在这里输入图像描述

也许这对别人也有帮助 看起来有更简单的方法来获取用于编译/构build.class的JAVA版本。 这种方式对JAVA版本的应用程序/类自我检查很有用。

我已经通过JDK库,发现这个有用的常量: com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION 。 我不知道从什么时候开始在JAVA JDK中。

尝试这段代码的几个版本常量,我得到如下结果:

SRC:

 System.out.println("JAVA DEV ver.: " + com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION); System.out.println("JAVA RUN v. XY: " + System.getProperty("java.specification.version") ); System.out.println("JAVA RUN v. WXYZ: " + com.sun.deploy.config.Config.getJavaVersion() ); //_javaVersionProperty System.out.println("JAVA RUN full ver.: " + System.getProperty("java.runtime.version") + " (may return unknown)" ); System.out.println("JAVA RUN type: " + com.sun.deploy.config.Config.getJavaRuntimeNameProperty() ); 

输出:

 JAVA DEV ver.: 1.8.0_77 JAVA RUN v. XY: 1.8 JAVA RUN v. WXYZ: 1.8.0_91 JAVA RUN full ver.: 1.8.0_91-b14 (may return unknown) JAVA RUN type: Java(TM) SE Runtime Environment 

在类字节码中实际存储常量 – 请参阅Main.call中红色标记的部分 – 存储在.class字节码中的常量

常量在类中用于检查JAVA版本是否过期(请参阅Java如何检查是否过期 )