1. 程式人生 > >android 通過反射訪問內部類(也可訪問其他apk中的類)

android 通過反射訪問內部類(也可訪問其他apk中的類)

//訪問某個屬性
Context mmsCtx = createPackageContext("com.android.lockscreen" Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);  Class<?> maClass = Class.forName("com.android.lockscreen.LockScreenActivity",true, mmsCtx.getClassLoader());  Object maObject = maClass.newInstance();
Field f_mPm = maClass.getDeclaredField("TAG");  f_mPm.setAccessible(true);              Log.i(LOG_TAG,"obj:"+f_mPm.get(maObject));

//訪問方法

//訪問 try { Context mmsCtx = createPackageContext("com.android.lockscreen" Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);  Class<?> maClass = Class.forName(
"com.android.lockscreen.LockScreenActivity",true, mmsCtx.getClassLoader());  Object maObject = maClass.newInstance(); Field f_mPm = maClass.getDeclaredField("TAG");  //maClass.getDeclaredMethod("", parameterTypes); f_mPm.setAccessible(true);              Log.i(LOG_TAG,"obj:"+f_mPm.get(maObject)); Class[] resource =
newClass[]{Context.class}; resourceObj =newObject[]{mmsCtx}; Method addsMethod = maClass.getDeclaredMethod("getLockScreenView", resource); addsMethod.setAccessible(true); View addsResult = (View)addsMethod.invoke(maObject, resourceObj); Log.i(LOG_TAG,"addsResult:"+addsResult); }catch(Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //定義被訪問 public class LockScreenActivity extendsActivity { privateString TAG ="LockScreenActivity"; //private LockScreen mScreen = new LockScreen(LockScreenActivity.this); privateLockScreen getLockScreenView(Context context){ Log.i(TAG,"context:"+context); returnnewLockScreen(context); } }
? //獲取setting包的的Context  Context mmsCtx = createPackageContext("com.android.settings" Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);  //使用setting的classloader載入com.android.settings.ManageApplications類  Class<?> maClass = Class.forName("com.android.settings.ManageApplications",true, mmsCtx.getClassLoader());  //建立它的一個物件  Object maObject = maClass.newInstance();  /* * 將私有域mPm賦值。因為mPm在SizeObserver的invokeGetSize中用到了, * 卻因為沒有執行onCreate而沒有初始化,所以要在此處初始化。 */  Field f_mPm = maClass.getDeclaredField("mPm");  f_mPm.setAccessible(true);              f_mPm.set(maObject, mmsCtx.getPackageManager());


轉自:http://www.cnblogs.com/wanqieddy/archive/2011/10/25/2224200.html