Как найти целевую версию Java для скомпилированного класса?

Duplicate:

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

Если у меня есть скомпилированный Java-класс, есть ли способ сказать только из файла класса, что такое его целевая совместимость версий? В частности, у меня есть несколько файлов классов, скомпилированных на Java 6, которые работают под Java 5 и выдают ошибку "Нераспознанная версия". Я хочу, чтобы иметь возможность посмотреть файл класса и найти, что его целевая версия совместимость без запуска JVM. Любые идеи?

Ответ 1

Я нашел это в сети, и он работает.

Каждый файл .class начинается с следующее:

  • Магический номер [4 байта]
  • Информация о версии [4 байта]

Скомпилирован hexdump файла '.class' с каждым из следующих вариантов показывает:

javac -target 1.1 == > CA FE BA BE 00 03 00 2D
javac -target 1.2 == > CA FE BA BE 00 00 00 2E
javac -target 1.3 == > CA FE BA BE 00 00 00 2F
javac -target 1.4 == > CA FE BA BE 00 00 00 30

Возможно, вы могли бы использовать эту информацию написать собственный файл .class утилита проверки версий, использующая Java, или, возможно, скрипт или оболочка язык;)!

Надеюсь, это поможет.

Энтони Борла

От: http://bytes.com/groups/java/16603-how-determine-java-bytecode-version

Ответ 2

Вы можете использовать утилиту javap, которая поставляется со стандартным JDK.

javap -verbose MyClass

Compiled from "MyClass.java"
public class MyClass extends java.lang.Object
SourceFile: "MyClass.java"
minor version: 3
major version: 45

Ответ 3

У пользователей Linux/Unix хороший инструмент из стандартного инструментария: file. Современные версии могут обнаруживать версию fusion класса Java и даже выводить версию Java для известных типов файлов классов.

Пример вывода:

com/sample/Tracker.class: compiled Java class data, version 45.3
com/sample/TestListener.class: compiled Java class data, version 49.0 (Java 1.5)

И он очень хорошо вписывается в стандартную инструментальную цепочку для Unix скриптов.

Ответ 4

Взято из: http://twit88.com/blog/2008/09/22/java-check-class-version/

try {
    String filename = "C:\\MyClass.class";
    DataInputStream in = new DataInputStream(new FileInputStream(filename));
    int magic = in.readInt();
    if (magic != 0xcafebabe) {
        log.info(filename + " is not a valid class!");
    }
    int minor = in.readUnsignedShort();
    int major = in.readUnsignedShort();
    log.info(filename + ": " + major + " . " + minor);
    in.close();
} catch (IOException e) {
    log.info("Exception: " + e.getMessage(), e);
}

Ответ 5

Вы можете посмотреть смещение байта 6 и 7 в файле (возможно, в шестнадцатеричном дампе), в котором указывается, какая версия используется. Я думаю, что Bytecode Visualizer (плагин eclipse) может видеть, для какой версии создан файл класса.

Дальнейшее чтение