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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM