天天看點

[Android] 利用java反射調用隐藏Api

Demo位址:http://download.csdn.net/detail/u011634756/5915513(免積分哦)

利用java反射調用隐藏Api,這個東西一般不具備應用的廣泛性,請慎用哦~

在我想來我們在Android上能用到就是在定制apk的時候廠商給出隐藏api,然後apk開發人員去調用。

demo比較簡單就直接上重點源碼了。

1.先說一下 給出方法名字和參數來調用方法

TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

// 首先擷取一個Clas對象 對象擷取方法有
// 2中方法,比較建議第二種哦
Class ownerClass = Class.forName("android.telephony.TelephonyManager");
// Class ownerClass = mTelephonyManager.getClass();

// 參數類型, 擷取的方法說不定會有好多重載過的 可以通過參數來确認
/**
 * 介個可以有好幾個參數的形勢 例如:Class[] argsClass = new Class[3]; argsClass[0] =
 * int.class; argsClass[1] = boolean.class; argsClass[0] = String.class;
 */
Class[] argsClass = new Class[1];
argsClass[0] = int.class;

// 參數, 在方法運作的時候需要的參數
/**
 * ====== 這個一定要 對應 要不然報錯了 很難找 和argsClass 一一對應。
 */
Object[] params = new Object[1];
params[0] = value;

// 擷取參數 getNetworkTypeName 是你要擷取的方法的名稱 argsClass 是你方法的參數類型
Method method = ownerClass.getMethod("getNetworkTypeName", argsClass);

// 使用 method.invoke 來調用方法 mTelephonyManager 調用方法的對象 ,params 則就是參數
return method.invoke(mTelephonyManager, params);
           

2. 擷取屬性和new對象

Class ownerClass = Class.forName("android.telephony.TelephonyManager");
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

//執行個體化一個對象
/***Object instance = ownerClass.newInstance();**/

// 我不清楚有沒有隐藏 我現在解随便來一個
Field field = ownerClass.getField("NETWORK_TYPE_GPRS");		

// 介個參數是我了解為是執行個體的對象 
int a =  (Integer) field.get(mTelephonyManager);

// 下面是一個超級bug的東西
// 怎麼bug 呢 據說如果field是一個private我們是不可以調用的但是反射是可以的哦
//由于是final類型的 我們先在這裡注釋掉哦
/***field.set(mTelephonyManager, 2);**/
           

====================關注小魚===================

新浪微網誌:http://weibo.com/AwareMissing

騰訊微網誌:http://t.qq.com/y_haiyang