Domanda

Ho il seguente frammento di codice java

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

Tutto va bene. Quando ho generare un file di classe e poi decompilarlo utilizzando uno strumento gratuito (JD-GUI), torno il seguente codice.

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

Così cambia if(condition2) continue; a if(!condition2); Non riuscivo a trovare alcuna info dall'altra if (senza parentesi). Qualcuno può spiegare la logica qui? Grazie in anticipo.

EDIT: Ho fatto qualche test e il decompilatore non funziona correttamente.

qui è il codice prima:

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

ecco il codice decompilato

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

dispiaciuto per disturbare tutti. : P Cercherò di eliminare questa domanda, se posso.

È stato utile?

Soluzione

è quasi impossibile per decompilers ricostruire la sintassi originale come stanno lavorando fuori l'interpretazione del compilatore del codice.

si scrive il codice Java, che viene compilato in byte di codice dal compilatore Java.

un decompilatore tenta quindi di creare codice Java dal codice di byte.

dal momento che i due frammenti di codice sono logicamente lo stesso, il decompilatore ha fatto il suo lavoro.

Modifica (visto il tuo commento):

In realtà, è del tutto possibile (e questo è abbastanza comune) che il decompilatore ha fatto un errore.

il if(!condition2); dichiarazione ha essenzialmente alcun effetto (fornito condizione2 è davvero un valore booleano e non pseudo codice).

dunque la tua prima //other stuff here verrà elaborato indipendentemente condition2 nella versione decompilato.

Sei sicuro che il codice decompilato funziona correttamente?

Altri suggerimenti

Un if senza corpo ( "senza parentesi graffe") è semplicemente un vuoto if che esegue alcun codice.

Si tratta di una rappresentazione alternativa / canonica della stessa logica. Decompilatori non conservano il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top