Работа с метками в декомпилированном коде - PullRequest
2 голосов
/ 14 июня 2011

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Если я правильно понимаю ваш вопрос, вы пытаетесь реорганизовать вставленный код. Перерывы как 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 отсутствует», поскольку она объявляется после ее использования. использование методов также поможет устранить эту ошибку.

0 голосов
/ 14 июня 2011

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

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

...