Как найти целевую версию 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) может видеть, для какой версии создан файл класса.
Дальнейшее чтение