2

我希望返回一个项目,该项目我之前丢失了源代码,但设法从用户​​那里获得了编译版本。我已经使用了一些反编译器来缓慢地将代码重新拼凑起来,但我被两个最终的“标签”困住了。

在过去三天尝试了一系列反编译器后,却发现他们中的大多数人发现这些片段更加困难,我作为最后的手段来到这里。我知道这是一个相当大的要求,特别是因为缺少上下文并且它的存在是不寻常的,但如果有经验的人能够理解这一点,那么幸运的话。

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

下面的代码片段有“label711”,我也不知道该怎么做。尽管非常脱离上下文,但它是一个完整的条件,尽管我不知道它会有多大意义。JD-GUI 生成的输出。 http://pastebin.com/5MLFxHPb

我想再次重申,我知道这是一个多么伟大的请求,但是在厌倦了 Java 或反编译器的视线之后,我来到这里希望能在这种情况下获得比我已经知道的更多的信息。

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

4

2 回答 2

1

如果我正确理解您的问题,您正在寻求重构粘贴的代码。中断就像 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 is missing”,因为它是在使用后声明的。使用方法也将有助于消除该错误。

于 2011-06-14T18:24:30.510 回答
0

看起来你的反编译器搞砸了,把标签放在错误的地方。至少对于第一个示例,如果您将 label337 移动到发生中断的最外层 for 循环,它应该可以正常编译并执行您期望的操作。对于另一个,您必须将 if 块修改为接近最后一个中断才能进行编译。

这是一个关于如何使用带标签的中断的简短教程:http: //download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

于 2011-06-14T18:14:54.423 回答