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