我希望回到一个我之前失去源代码但已设法从用户那里获得编译版本的项目。我使用了一些反编译器来慢慢地将代码重新拼凑在一起,但仍然坚持使用两个最终的“标签”。
在过去三天尝试了一系列反编译器之后,我发现大多数反编译器发现这些片段更加困难,我来到这里作为最后的手段。我知道这是一个相当大的要求,尤其是因为缺少上下文并且它的存在是不寻常的,但如果幸运的话,有经验的人将能够理解这一点。
以下代码段包含“label337”,我不知道如何解决。我知道它们是某种指针,但我没有想到我会如何重新排列代码。 JD-GUI 产生的输出。 http://pastebin.com/mVNksm13
以下代码段包含“label711”,我也不知道该怎么做。尽管完全脱离了上下文,但它是一个完整的条件,尽管我不知道它会有多大意义。 JD-GUI 产生的输出。 http://pastebin.com/5MLFxHPb
我想再次重申,我知道这是一个多么大的要求,但是在厌倦了 Java 或反编译器的视线之后,我来到这里希望能比我已经了解的更多地阐明这种情况知道。
编辑: 我试图反编译的 jar 严重依赖于我有权访问的另一个 jar。在反编译期间以某种方式指向类所依赖的 jar 会产生更好的输出吗?我尝试搜索如何在反编译器中链接到此类依赖项,但一无所获。
最佳答案
如果我正确理解您的问题,您正在寻求重构粘贴的代码。中断就像 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 丢失”,因为它是在使用后声明的。使用方法也有助于消除该错误。
关于java - 处理反编译代码中的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6347930/