我有下面的Java代码片段

while (condition1){
    switch (someinteger){
        case 1:
            if(condition2) continue;
            // other stuff here
            break;
        // other cases here
    }
}

全部优良。当我生成的类文件中,然后使用一个免费的工具(JD-GUI)反编译它,我回来下面的代码。

while (condition1){
    switch (someinteger){
        case 1:
            if(!condition2);
            // other stuff here
            break;
        // other cases here
    }
}

于是它改变if(condition2) continue;if(!condition2); 我无法找到其他任何信息if语句(不含括号)。 任何人都可以在这里解释的逻辑是什么?提前致谢。

编辑:我做了一些更多的测试和反编译器不能正常工作。

这里是代码之前:

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{
    int commentON=0, quoteON=0;
    int b1;
    while ((b1 = f1.read()) != -1){
        switch ((char) b1){
            case '\\':
                    if (commentON==0){
                            quoteON = 1;
                            break;
                    }
                    continue;
            case '\n':
                    if (commentON>0){ commentON=0; continue; }
                    break;
            case '%':
                    if (commentON>0) continue;
                    if (quoteON>0) { quoteON=0; break; }
                    commentON=2;
                    continue;
            default:
                    if (commentON>0) continue;
                    if (quoteON>0) quoteON=0;
                    break;
        }
        f2.write(b1);
    }
}

这里是反编译的代码

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException
{
int commentON = 0; int quoteON = 0;

while ((b1 = f1.read()) != -1)
{
  int b1;
  switch ((char)b1)
  {
  case '\\':
    if (commentON == 0);
    quoteON = 1;
    break;
  case '\n':
    if (commentON <= 0) break label109; commentON = 0; break;
  case '%':
    if (commentON <= 0);
    if (quoteON > 0) { quoteON = 0; break label109: }
    commentON = 2;
    break;
  }
  if (commentON <= 0);
  if (quoteON > 0) quoteON = 0;

  label109: f2.write(b1);
}
}

抱歉打扰大家。 :P 如果我可以,我会尝试删除这个问题。

有帮助吗?

解决方案

几乎是不可能的反汇编重建原始的语法,因为他们正在把你的代码的编译器的解释。

在编写Java代码,其被编译由Java编译器将字节码。

反编译然后试图从字节代码创建的Java代码。

由于两个代码片段是在逻辑上是相同的,反编译已经做它的工作。

修改(看到您的评论):

实际上,这是相当可能的(这是很常见),该反编译已经犯了一个错误。

语句if(!condition2);基本上具有任何作用(提供条件2确实是一个布尔值,而不是伪代码)。

因此你的第一//other stuff here将无论condition2在反编译版本处理。

你确定的反编译的代码工作正常?

其他提示

这是如果与没有身体(“无大括号”)陈述仅仅是一个空的,如果执行无代码语句。

有相同的逻辑的替代/规范表示。反编译不保留代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top