Цикл превращается в цикл while в скомпилированном файле класса
В моей команде мы используем Java 1.4.2. Большая часть машины for loop компилируется как only.ie. если я декомпилирую файл класса, я смогу увидеть только цикл, но на некоторых машинах определенного разработчика он становится циклом while. т.е. когда я декомпилирую определенные классы
Как это может случиться? Любая возможная причина, версия Java или конфигурация, которую может принять любое тело, чтобы я мог воспроизвести этот дефект и исправить его на всех машинах разработчиков.
5 ответов
Я бы не назвал это дефектом. Когда вы компилируете Java в байт-коды, некоторая информация теряется. Когда вы впоследствии декомпилируете байт-коды, нет никакой гарантии, что полученный исходный код Java будет точно соответствовать тому, с чем вы начали.
В частности, язык байт-кода не имеет конкретных инструкций для разных типов циклов. Циклы Java компилируются в байт-коды, которые используют инструкции сравнения и переходы. Декомпилятор должен сделать обоснованное предположение при решении, какой тип цикла использовался для создания данных байт-кодов.
Различие в поведении на разных машинах, вероятно, связано с различиями в точных версиях компилятора и декомпилятора, установленных на этих машинах, или, возможно, с тем, как настроены эти инструменты.
Код для while
а также for
являются взаимозаменяемыми, и по байт-коду невозможно определить, какой из них использовался (вы могли бы вывести его). Вы не можете воспроизвести комментарии из байт-кода и не можете достоверно различать циклы for и while.
например
while(condition)
а также
for(;condition;)
а также
while(true) {
if(!condition) break;
}
подобные.
В байт-коде нет циклов, есть только условные и безусловные переходы (иначе gotos). Таким образом, декомпилятор делает все возможное, чтобы восстановить цикл, основанный на структуре переходов.
Оптимизация компилятора никогда не изменит то, что на самом деле делает код .
Даже если разные компиляторы по-разному оптимизируют ваш код, семантика программы никогда не изменится: пользователь всегда будет получать одинаковые результаты.
Это не ошибка, нуждающаяся в исправлении. Там нет исправить. Там нет ошибки.
Это, вероятно, вызвано компилятором optimization settings
, проверьте настройки оптимизации на разных машинах. Попробуйте отключить все оптимизации или равный уровень оптимизации.