zoukankan      html  css  js  c++  java
  • Android开发之通过反射获取到Android隐藏的方法

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

    比如方法:getPackageSizeInfo(),通过这个方法可以获取到apk的CacheSize,CodeSize,DataSize等信息,但是该方法是隐藏的,@hide

    遇到这种情况,需要使用反射:

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

    getPackageSizeInfo()反射以后的使用:

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

    反射参数说明:

    PackageManager源码:

    1     public abstract void getPackageSizeInfo(String packageName, int userHandle,
    2             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

    ------------------------------------------------------------------------------------------------------------------------------

    第二种反射方法:

    1 Method method = null;
    2 Method[] methods = PackageManager.class.getMethods();
    3   for ( Method m : methods ) {
    4       if ( "getPackageSizeInfo".equals(m.getName()) ) {
    5            method = m;
    6          }
    7       }

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

  • 相关阅读:
    golang的string是包使用
    OTHER状态的mongodb副本集成员转换为独立的新副本集primary
    linux命令行快捷键
    如何配置vcodes成最美观的样子,让你从此爱上代码
    记一次Lock wait timeout异常的排查过程
    mysql变更上线流程
    go build 使用
    Makefile文件
    解决 windows10系统和AOC显示器时不时地闪现黑屏问题
    feign调用添加header参数
  • 原文地址:https://www.cnblogs.com/liyiran/p/5296756.html
Copyright © 2011-2022 走看看