Переключение между версиями байт-кода для файла класса Java - PullRequest
2 голосов
/ 01 октября 2009

При наличии файла класса Java (ClassName.class) с версией байт-кода X существует ли общий способ преобразования этого файла класса из представления в версии байт-кода X в представление в версии байт-кода Y?

Предположения:

  • Исходный код недоступен. Файл класса является единственным доступным представлением класса.
  • Файл класса сильно запутан, поэтому декомпиляция класса с помощью, скажем, jad или аналогичной программы, а затем повторная компиляция с помощью -target ... не работает.

Обновления после исходного сообщения:

  • Обновление № 1: далее предположим, что версия байт-кода X и версия Y байт-кода достаточно близки, так что все инструкции, используемые классом (в настоящее время в версии X байт-кода), также существуют в версии Y.

Ответы [ 4 ]

3 голосов
/ 01 октября 2009

Для понижения версии вы можете взглянуть на различные методы, чтобы заставить код Java 5/6 работать в Java 1.3 / 1.4. См. Мой ответ на связанный вопрос Backport Возможности Java 5/6 для Java 1.4?

2 голосов
/ 01 октября 2009

Вы можете использовать Apache BCEL

Библиотека байт-кода предназначен, чтобы дать пользователям удобный возможность анализировать, создавать и манипулировать (двоичными) файлами классов Java

BCEL дает вам возможность читать в файле класса заданной версии, манипулировать им, генерировать новый поток файла класса, а затем загружать его в виртуальную машину с помощью низкоуровневого ClassLoader API. Без сомнения, очень рискованно, и я сомневаюсь, что это позволит вам понизить версию так же легко, как вы могли бы ее выполнить.

1 голос
/ 19 ноября 2009

Использование ретро-ткач

1 голос
/ 01 октября 2009

Нет. Хотя более поздние версии Java смогут выполнять этот байт-код, вы не можете обновить его: более поздние версии файлов классов имеют другой формат.

Вы также не можете понизить его, потому что в старых версиях Java нет способа заменить отсутствующие байт-коды другими конструкциями.

[EDIT] IIRC, Sun добавил по крайней мере одну новую инструкцию для байт-кода для каждой основной версии Java. Обычно это является причиной основных выпусков Java: изменения в байт-коде.

Тем не менее, просто попытайте удачу и измените основную версию файла класса и посмотрите, загрузит ли ваша новая ВМ ее. Я сомневаюсь, что это подойдет для любого сложного примера, но вам может повезти.

...