Android开发之通过反射获取到Android隐藏的方法

来源:互联网 发布:淘宝怎么传宝贝视频 编辑:程序博客网 时间:2024/06/09 20:46

感恩原创:http://www.cnblogs.com/liyiran/p/5296756.html

在PackageManger中,有些方法被隐藏了,无法直接调用,需要使用反射来获取到该方法。

比如方法:getPackageSizeInfo(),通过这个方法可以获取到apk的CacheSize,CodeSize,DataSize等信息,但是该方法是隐藏的,@hide。
遇到这种情况,需要使用反射:

try {    //通过反射,获取到PackageManager隐藏的方法getPackageSizeInfo()    Method getPackageSizeInfo = PackageManager.class.getMethod("getPackageSizeInfo", String.class, int.class, IPackageStatsObserver.class);} catch ( NoSuchMethodException e ) {    e.printStackTrace();}

getPackageSizeInfo()反射以后的使用:

getPackageSizeInfo.invoke(mPm, appInfo.packageName, myUserId.invoke(null, null), myStatsObserver);

反射参数说明:

PackageManager源码:

public abstract void getPackageSizeInfo(String packageName, int userHandle,IPackageStatsObserver observer);

通过源码可以看出来,该方法需要三个参数,第一个参数为String类型的packageName,第二个参数是int类型的userHandle,第三个参数是IPackageStatsObserver类型的observer

所以getMethod()需要填写的参数:

第一个参数为该方法名:“getPackageSizeInfo”

第二个参数为getPackageSizeInfo()的第一个参数:String.class

第三个参数为getPackageSizeInfo()的第二个参数:int.class

第四个参数为getPackageSizeInfo()的第三个参数:IPackageStatsObserver.class

这样就可以通过反射获取到该方法,然后就是该方法的使用了,如下:

通过invoke()方法使用

第一个参数:执行该方法的类,mPm

第二个参数:包名,appInfo.packageName

第三个参数:UserHandle.myUserId(),因为该方法也是隐藏的,所以需要使用反射获取到该方法。

第四个参数:IPackageStatsObserver的对象,myStatsObserver

第二种反射方法:

Method method = null;Method[] methods = PackageManager.class.getMethods();  for ( Method m : methods ) {      if ( "getPackageSizeInfo".equals(m.getName()) ) {           method = m;         }      }

通过getMethods获取到该类的所有方法,然后遍历方法,通过判断方法名来判断是否是getPackageSizeInfo()方法,然后赋值给method方法。然后就可以使用method了。

阅读全文
0 0
原创粉丝点击