在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了。