2

次の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
    }
}

そのため、 I could not find any info on the other if statement (波括弧なし)に変更if(condition2) continue;されます。if(!condition2);ここでロジックを説明できる人はいますか? 前もって感謝します。

編集:さらにいくつかのテストを行いましたが、逆コンパイラが正しく機能しません。

前のコードは次のとおりです。

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 できればこの質問を削除しようと思います。

4

3 に答える 3

4

逆コンパイラが元の構文を再構築することは、コンパイラによるコードの解釈に基づいているため、ほぼ不可能です。

JavaコンパイラによってバイトコードにコンパイルされるJavaコードを記述します。

次に、逆コンパイラがバイト コードから Java コードを作成しようとします。

2 つのコード フラグメントは論理的に同じであるため、逆コンパイラはその役割を果たしています。

編集(あなたのコメントを見た):

実際、逆コンパイラがエラーを起こしている可能性は十分にあります (これはよくあることです)。

ステートメントif(!condition2);は本質的に何の効果もありません (条件 2 が実際にブール値であり、疑似コードではない場合)。

したがって、逆コンパイルされたバージョンに//other stuff here関係なく、最初のものが処理されます。condition2

逆コンパイルされたコードは正しく動作しますか?

于 2010-01-14T00:44:44.373 に答える
1

本文のない(「中括弧なし」の)ifステートメントは、コードを実行しない単に空のifステートメントです。

于 2010-01-14T00:46:01.300 に答える
0

これは、同じロジックの代替/標準表現です。デコンパイラーはコードを保存しません。

于 2010-01-14T00:47:41.830 に答える