Pergunta

Eu tenho o seguinte fragmento de código Java

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

Está tudo bem. Quando eu gero um arquivo de classe e o descomponho usando uma ferramenta gratuita (JD-Gui), retiro o código a seguir.

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

Então isso muda if(condition2) continue; para if(!condition2);Não consegui encontrar nenhuma informação sobre o outro se a instrução (sem aparelho). Alguém pode explicar a lógica aqui? Desde já, obrigado.

EDIT: Fiz mais alguns testes e o decompilador não funciona corretamente.

Aqui está o código antes:

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);
    }
}

Aqui está o código descompilado

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);
}
}

Desculpe incomodar todos. : P Vou tentar excluir esta pergunta, se puder.

Foi útil?

Solução

É quase impossível para os decompiladores reconstruir sua sintaxe original, pois eles estão trabalhando na interpretação do seu código pelo compilador.

Você escreve código Java, que é compilado ao código de byte pelo compilador Java.

Um decompilador tenta criar código Java a partir do código de byte.

Como os dois fragmentos de código são logicamente os mesmos, o decompilador fez seu trabalho.

Editar (vi seu comentário):

Na verdade, é bem possível (e isso é bastante comum) que o decompilador cometeu um erro.

a declaração if(!condition2); Essencialmente, não tem nenhum efeito (desde que a condição2 seja realmente um código booleano e não pseudo).

Portanto, seu primeiro //other stuff here seria processado independentemente de condition2 na versão descompilada.

Tem certeza de que o código descompilado funciona corretamente?

Outras dicas

Uma instrução IF sem órgão ("sem aparelho encaracolado") é simplesmente uma instrução IF vazia que não executa o código.

É uma representação alternativa/canônica da mesma lógica. Os decompiladores não preservam o código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top