处理反编译代码中的标签

时间:2011-06-14 18:02:27

标签: java label decompiling jad

我希望回到我之前失去源代码的项目,但已经设法从用户​​那里获得编译版本。我已经使用了一些反编译器来再次慢慢地将代码拼凑在一起但是仍然坚持使用两个最终的“标签”。

在过去三天尝试了一系列反编译器之后,发现他们中的大多数人发现这些片段更令人挣扎,我作为最后的手段来到这里。我知道这是一个非常大的请求,特别是因为缺少上下文,它的存在是不寻常的,但有一点经验,有经验的人将能够理解这一点。

以下代码段有'label337',我不知道如何解决。我知道它们是各种各样的指针,但我不会想到如何重新排列代码。 JD-GUI生成的输出。 http://pastebin.com/mVNksm13

以下代码段有'label711',我也不知道该怎么做。虽然大大脱离了上下文,但这是一个完整的条件,虽然我不知道它会有多大意义。 JD-GUI生成的输出。 http://pastebin.com/5MLFxHPb

我再次重申,我知道这是一个多么伟大的请求,但是在厌倦了看到Java或反编译器之后,我来到这里希望能够在这个场景中发现任何进一步的光线,而不是我已经知道。

编辑: 我试图反编译的jar很大程度上依赖于我可以访问的另一个jar。会以某种方式指向反编译期间类所依赖的jar会产生更好的输出吗?我试着在反编译器中查找如何链接到这些依赖项但却一无所获。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你正在寻找重构粘贴的代码。休息就像GOTO声明。重新计算此代码的最简单方法是使用方法。

你有一个if 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缺失”,因为它在使用后会被声明。使用方法也有助于消除该错误。

答案 1 :(得分:0)

看起来你的反编译器搞砸了,把标签放在错误的位置。至少对于第一个例子,如果你将label337移动到发生中断的最外面的for循环中,它应该编译得很好并按你的意愿行事。对于另一个,你必须将if块修改为接近最后一个break以进行编译。

以下是有关如何使用标签符号的简要教程:http://download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html