题
我有下面的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
在反编译版本处理。
你确定的反编译的代码工作正常?
其他提示
这是如果与没有身体(“无大括号”)陈述仅仅是一个空的,如果执行无代码语句。
有相同的逻辑的替代/规范表示。反编译不保留代码。
不隶属于 StackOverflow