maroph icon

Python3: get Java class file major/minor version

maroph | PRO | 11/13/22 07:59:15 AM UTC (Edited) | 0 ⭐ | 329 👁️ | Never ⏰ | []
Python |

2 KB

|

None

|

0 👍

/

0 👎

#!/usr/bin/env python3
# extract major/minor version number from a given class file
import os
import sys
 
if len(sys.argv) < 2:
    print("class file name missing")
    sys.exit(1)
 
classfile = sys.argv[1]
 
if not os.path.isfile(classfile):
    print("class file " + classfile + " does not exist")
    sys.exit(1)
 
with open(classfile,"rb") as f:
    ba = f.read(8)
 
    if len(ba) < 8:
        print("given file is not a class file")
        sys.exit(1)
 
    if ba[0] != 0xca or ba[1] != 0xfe or ba[2] != 0xba or ba[3] != 0xbe:
        print("given file is not a class file")
        sys.exit(1)
 
    major = int(ba[6]) << 8 | int(ba[7])
    minor = int(ba[4]) << 8 | int(ba[5])
 
    # dictionary: (Java class file major version, Java version)
    # OpenJDK distributions:
    # AdoptOpenJDK : https://adoptopenjdk.net/ (before July 2021)
    # Adoptium     : https://adoptium.net/     (from July 2021 on)
 
    javaDict = {
        63: "Java 19 (Adoptium Support: MAR-2023)",
        62: "Java 18 (Adoptium Support: SEP-2022)",
        61: "Java 17 (LTS: Adoptium Support: >= OCT-2027)",
        60: "Java 16 (Adoptium Support: SEP-2021)",
        59: "Java 15 (AdoptOpenJDK Support: MAR-2021)",
        58: "Java 14 (AdoptOpenJDK Support: SEP-2020)",
        57: "Java 13 (AdoptOpenJDK Support: MAR-2020)",
        56: "Java 12 (AdoptOpenJDK Support: SEP-2019)",
        55: "Java 11 (LTS: Adoptium Support: >= OCT-2024)",
        54: "Java 10 (AdoptOpenJDK Support: SEP-2018)",
        53: "Java 9 (AdoptOpenJDK Support: MAR-2018)",
        52: "Java 8 (1.8 - LTS: Adoptium Support: >= NOV-2026)",
        51: "Java 7 (1.7)",
        50: "Java 6 (1.6)",
        49: "Java 5 (1.5)",
        48: "Java 1.4",
        47: "Java 1.3",
        46: "Java 1.2",
        45: "Java 1.0/1.1"
    }
 
    if major in javaDict:
        java = javaDict[major]
    else:
        java  = "unknown"
 
    print("major: 0x%04x (%d) , minor: 0x%04x (%d) , version: %s" % (major, major, minor, minor, java))

Comments