Работа с метками в декомпилированном коде
Я хочу вернуться к проекту, в котором я давно потерял исходники, но сумел получить скомпилированную версию от пользователя. Я использовал несколько декомпиляторов, чтобы медленно собрать воедино код, но застрял с двумя последними "метками".
Потратив последние три дня, пытаясь найти несколько декомпиляторов, но обнаружил, что большинство из них находят эти фрагменты еще более трудными, я прихожу сюда в качестве последнего средства. Я понимаю, что это довольно большая просьба, особенно в связи с отсутствием контекста и необычностью его присутствия, но, если повезет, кто-то из опытных сможет это понять.
В следующем фрагменте есть "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