Инструмент для чтения и отображения версий Java .class

Достаточно легко прочитать jvm-bytecode class file signature и получить эти значения jvm-bytecode без стороннего API. Все, что jvm-bytecode вам нужно сделать, это прочитать jvm-bytecode первые 8 байтов.

ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;

Для версии jvm-bytecode файла класса 51.0 (Java 7) открывающие jvm-bytecode байты:

CA FE BA BE 00 00 00 33

...где 0xCAFEBABE — магические jvm-bytecode байты, 0x0000 — младшая версия, а jvm-bytecode 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);
    }
  }
}

Ходьба jvm-bytecode по каталогам (File) и архивам jvm-bytecode (JarFile) в поисках файлов класса jvm-bytecode тривиальна.

Oracle Joe Darcy's blog перечисляет jvm-bytecode class version to JDK version mappings до Java 7:

Target   Major.minor Hex
1.1      45.3        0x2D
1.2      46.0        0x2E
1.3      47.0        0x2F
1.4      48.0        0x30
5 (1.5)  49.0        0x31
6 (1.6)  50.0        0x32
7 (1.7)  51.0        0x33
8 (1.8)  52.0        0x34
9        53.0        0x35

jvm-bytecode

2022-11-06T15:59:10+00:00