編輯: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
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放