Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android反編譯系列一之從掃雷游戲學習反編譯Switch語句,if條件語句

Android反編譯系列一之從掃雷游戲學習反編譯Switch語句,if條件語句

編輯:Android開發實例

今天學習Android反編譯中的Switch和if

 源碼:

public void updateNumber(int text) {

if (text != 0) {

this.setText(Integer.toString(text));

switch (text) {

case 1:

this.setTextColor(Color.BLUE);

break;

case 2:

this.setTextColor(Color.rgb(0, 100, 0));

break;

case 3:

this.setTextColor(Color.RED);

break;

case 4:

this.setTextColor(Color.rgb(85, 26, 139));

break;

case 5:

this.setTextColor(Color.rgb(139, 28, 98));

break;

case 6:

this.setTextColor(Color.rgb(238, 173, 14));

break;

case 7:

this.setTextColor(Color.rgb(47, 79, 79));

break;

case 8:

this.setTextColor(Color.rgb(71, 71, 71));

break;

case 9:

this.setTextColor(Color.rgb(205, 205, 0));

break;

 

}

}

}

 

2.編譯後的代碼

public void updateNumber(int i)

{

char c;

char c1;

byte byte0;

byte byte1;

int j;

c = '\315';

c1 = '\213';

byte0 = 79;

byte1 = 71;

j = 0;

if (i == 0) goto _L2; else goto _L1

_L1:

String s = Integer.toString(i);

setText(s);

i;

JVM INSTR tableswitch 1 9: default 88

//                1 89

//                2 98

//                3 118

//                4 127

//                5 146

//                6 165

//                7 187

//                8 207

//                9 227;

   goto _L2 _L3 _L4 _L5 _L6 _L7 _L8 _L9 _L10 _L11

_L2:

return;

_L3:

setTextColor(0xff0000ff);

continue; /* Loop/switch isn't completed */

_L4:

int k = Color.rgb(j, 100, j);

setTextColor(k);

continue; /* Loop/switch isn't completed */

_L5:

setTextColor(0xffff0000);

continue; /* Loop/switch isn't completed */

_L6:

int l = Color.rgb(85, 26, c1);

setTextColor(l);

continue; /* Loop/switch isn't completed */

_L7:

int i1 = Color.rgb(c1, 28, 98);

setTextColor(i1);

continue; /* Loop/switch isn't completed */

_L8:

int j1 = Color.rgb(238, 173, 14);

setTextColor(j1);

continue; /* Loop/switch isn't completed */

_L9:

int k1 = Color.rgb(47, byte0, byte0);

setTextColor(k1);

continue; /* Loop/switch isn't completed */

_L10:

int l1 = Color.rgb(byte1, byte1, byte1);

setTextColor(l1);

continue; /* Loop/switch isn't completed */

_L11:

int i2 = Color.rgb(c, c, j);

setTextColor(i2);

if (true) goto _L2; else goto _L12

_L12:

}

 

由此我們可以看到,Java源代碼在編譯後會產生許多的中間變量,而且變量的名稱也會發生改變。

 

if條件語句

一般情況下

public void updateNumber(int text) {

If(text!=0)

{

this.setText(Integer.toString(text));

...

}

}

編譯後是

public void updateNumber(int text) {

If(text==0)

Goto _L2 else goto _L1

 

_L2:

return;

_L1:

String s = Integer.toString(i);

setText(s);

...

}

 

Switch語句

JVM INSTR tableswitch 1 9: default 88是Switch語句的標志

JVM INSTR tableswitch 1 9: default 88

//                1 89

//                2 98

//                3 118

//                4 127

//                5 146

//                6 165

//                7 187

//                8 207

//                9 227;

   goto _L2 _L3 _L4 _L5 _L6 _L7 _L8 _L9 _L10 _L11

從上面加藍色的代碼中我們我可以得出該Switch語句有9個分支case:1-9.

  

從上面加紅色的代碼中我們我可以得出

L2:

case default:break;

我們在源代碼中的枚舉值會轉化為十六進制。一些經常用到的常數會將它定義為一個變量。

 

每個標志位的"continue"說明該分支break;

最後一個分支的標志是if (true) goto _L2; else goto _L12

 

我們再做一個例子

 

public void updateNumber(int text) {

if (text != 0) {

this.setText(Integer.toString(text));

switch (text) {

case 1:

this.setTextColor(Color.BLUE);

break;

case 2:

this.setTextColor(Color.rgb(0, 100, 0));

break;

 

case 9:

this.setTextColor(Color.rgb(205, 205, 0));

break;

 

}

}

}

編譯後

是諸如JVM INSTR tableswitch 1 9: default 88是Switch語句的標志

JVM INSTR tableswitch 1 9: default 88

//                1 89

//                2 98

           

//                9 227;

   goto _L2 _L3 _L4 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved