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