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

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

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

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

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

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

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

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 отсутствует", поскольку она объявляется после ее использования. Использование методов также поможет устранить эту ошибку.

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

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

Другие вопросы по тегам