Работа с метками в декомпилированном коде

Я хочу вернуться к проекту, исходный код которого я потерял некоторое время назад, но мне удалось получить скомпилированную версию от пользователя. Я использовал несколько декомпиляторов, чтобы снова медленно собрать код, но застрял на двух последних «метках».

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

В следующем фрагменте есть «label337», и я понятия не имею, как его обойти. Я понимаю, что это своего рода указатели, но мне не приходит в голову, как бы я изменил код. Вывод производится JD-GUI. http://pastebin.com/mVNksm13

В следующем фрагменте есть «label711», с которым я тоже не знаю, что делать. Хотя это и вырвано из контекста, это целое условие, хотя я не знаю, насколько оно будет иметь смысл. Вывод производится JD-GUI. http://pastebin.com/5MLFxHPb

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

РЕДАКТИРОВАТЬ: банка, которую я пытаюсь декомпилировать, сильно зависит от другой банки, к которой у меня есть доступ. Будет ли как-то указание на банку, от которой зависят классы во время декомпиляции, лучше выводить? Я попытался найти ссылку на такие зависимости в декомпиляторе, но ничего не нашел.


person Ploo    schedule 14.06.2011    source источник


Ответы (2)


Если я правильно понимаю ваш вопрос, вы хотите провести рефакторинг вставленного кода. Разрывы похожи на инструкции GOTO. Самый простой способ пересмотреть этот код - использовать методы.

У вас есть один длинный оператор if / else, который, если его переместить в метод, позволит вам вместо этого использовать операторы return. Вот сокращенная форма вашего первого примера

for (final TileInfo t : this.myTiles) {
  if (rsi != null) {
    //do something
  } else if (rso != null) {
    //if some condition; break label337;
  }else{
    //do something else
  }
}
label337: for (TileInfo t : fallenTiles) {         
}

вместо этого создайте новые методы для выполнения вашей логики

private void CheckMyConditionsMethod(MyParameters obj){
    if (rsi != null) {
        //do something
    } else if (rso != null) {
        //if some condition return;
    }else{
        //do something else
    }
    fallenTilesMethod(fallenTiles);
}

private void fallenTilesMethod(ArrayList<TileInfo> fallenTiles){
   for (TileInfo t : fallenTiles) {         
   }
}

теперь ваш код сокращен до

for (final TileInfo t : this.myTiles) {
      CheckMyConditionsMethod(myobj);
}

Также в вашем исходном случае у вас, скорее всего, есть ошибка компиляции «Метка label337 отсутствует», поскольку она объявляется после ее использования. использование методов также поможет устранить эту ошибку.

person Sean    schedule 14.06.2011
comment
Если это так, то к какому блоку кода относится метка. Это блок кода, начинающийся сразу после метки до следующего}, или он относится только к циклу for, которому предшествует? - person Ploo; 14.06.2011
comment
метка запускает ваш второй оператор for, а разрыв переходит к этой точке в коде и продолжается - person Sean; 14.06.2011
comment
В этом случае просто не нужно переходить для цикла for (TileInfo t: fallenTiles), чтобы заменить оба прерывания label337; операторы, конечно, после добавления фигурных скобок или я что-то упустил? - person Ploo; 14.06.2011
comment
в случае, который я привел выше, все, что вам нужно сделать, это заменить операторы break label337 на return. Сделав это, вы выйдете из метода и перейдете ко второму циклу for, который вы бы в любом случае нарушили. - person Sean; 14.06.2011
comment
позвольте мне на мгновение возразить себе, я только что прочитал документ, прошло некоторое время с тех пор, как я смотрел, использовал ярлыки. если используется в перерыве, он пропустит переданную конечную скобку помеченного кода. позвольте мне отредактировать приведенный выше код - person Sean; 14.06.2011

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

Вот краткое руководство по использованию разрывов с ярлыками: http://download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

person Mikola    schedule 14.06.2011