цикл превращается в цикл while в скомпилированном файле класса - PullRequest
1 голос
/ 23 февраля 2012

В моей команде мы используем java 1.4.2. Большая часть машины for loop компилируется как only.ie. если я декомпилирую файл класса, я могу видеть только цикл, но на некоторых машинах определенного разработчика он становится циклом while. то есть, когда я декомпилирую определенные классы, это делается, пока

Как это может произойти? Любая возможная причина, версия Java или конфигурация, которую может принять любое тело, чтобы я мог воспроизвести этот дефект и исправить его на всех машинах разработчиков

Ответы [ 5 ]

6 голосов
/ 23 февраля 2012

Код для while и for являются взаимозаменяемыми, и по байт-коду невозможно определить, какой из них использовался (вы можете сделать вывод). Вы не можете воспроизвести комментарии из байт-кода и не можете сказать надежноразличия между циклами for и while.

например,

while(condition)

и

for(;condition;)

и

while(true) {
   if(!condition) break;

}

одинаковы.

6 голосов
/ 23 февраля 2012

Я бы не назвал это дефектом.Когда вы компилируете Java в байт-коды, некоторая информация теряется.Когда вы впоследствии декомпилируете байт-коды, нет никакой гарантии, что полученный исходный код Java будет точно соответствовать тому, с чем вы начали.

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

Различие в поведении на разных машинах, вероятно, связано с различиями в точных версиях компилятора и декомпилятора.установлен на этих машинах, или, возможно, с тем, как настроены эти инструменты.

3 голосов
/ 23 февраля 2012

В байт-коде нет циклов, есть только условные и безусловные переходы (иначе gotos). Таким образом, декомпилятор делает все возможное, чтобы восстановить цикл, основанный на структуре переходов.

0 голосов
/ 23 февраля 2012

Оптимизация компилятора никогда не изменит то, что на самом деле делает код .

Даже если разные компиляторы делают разные оптимизации для вашего кода, никогда не будет никакой разницы в семантике программы:пользователь всегда будет получать одинаковые результаты.

Это не ошибка, нуждающаяся в исправлении.Там нет исправить.Там нет ошибки.

0 голосов
/ 23 февраля 2012

это, вероятно, вызвано компилятором optimization settings.проверьте настройки оптимизации на разных машинах.попробуйте отключить все оптимизации или равный уровню оптимизации.

...