android 通過反射訪問內部類(也可訪問其他apk中的類)
阿新 • • 發佈:2018-12-26
//訪問某個屬性
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 = new Class[]{Context. class };
resourceObj = new Object[]{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 extends Activity {
private String TAG = "LockScreenActivity" ;
//private LockScreen mScreen = new LockScreen(LockScreenActivity.this);
private LockScreen getLockScreenView(Context context){
Log.i(TAG, "context:" +context);
return new LockScreen(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