Как найти целевую версию Java для скомпилированного класса? - PullRequest
12 голосов
/ 30 марта 2009

Дубликат:

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

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

Ответы [ 5 ]

37 голосов
/ 30 марта 2009

Вы можете использовать утилиту 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
23 голосов
/ 30 марта 2009

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

Каждый файл .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

5 голосов
/ 25 апреля 2013

У пользователей Linux / Unix есть стандартный инструмент из стандартной панели инструментов: утилита file. Современные версии могут определять версию класса 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.

3 голосов
/ 30 марта 2009

Взято из: 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);
}
0 голосов
/ 30 марта 2009

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

Дополнительная литература

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...