10_通过反射获得未暴露的方法:
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
public class DemoActivity extends Activity {
private PackageManager pm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pm = getPackageManager();
try {
/********************* getPackageSizeInfo 是私有的,没有暴露出来,不能直接调用*************/
/*************** 如果不知道getPackageSizeInfo参数的类型,则可以通过下面的方法来获取
Method[] methods = PackageManager.class.getMethods();
for (int i = 0; i < methods.length; i++) {
if ("getPackageSizeInfo".equals(methods[i].getName())) {
Class<?>[] paras = methods[i].getParameterTypes();
for(int j=0;j<paras.length;j++){
System.out.println(paras[j]); //获得参数类型
}
}
}****************************************************************/
Method method = PackageManager.class.getMethod("getPackageSizeInfo", new Class[]{String.class,IPackageStatsObserver.class});
method.invoke(pm, new Object[]{"cn.itcast.mobilesafe",new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
System.out.println("----------------");
long cachesize = pStats.cacheSize;
long codesize = pStats.codeSize;
long datasize = pStats.dataSize;
System.out.println("datasize"+datasize);
System.out.println("codesize"+codesize);
System.out.println("cachesize"+cachesize);
}
}});
} catch (Exception e) {
e.printStackTrace();
}
}
}