现在的位置: 首页 > 移动开发 > 正文

android反射方式访问内部类成员 .

2019年05月20日 移动开发 ⁄ 共 2730字 ⁄ 字号 评论关闭
//访问某个属性

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 extendsActivity {
         
    privateString TAG =
"LockScreenActivity";
    //private LockScreen mScreen = new LockScreen(LockScreenActivity.this);
     
    privateLockScreen getLockScreenView(Context context){
         
        Log.i(TAG,"context:"+context);
        returnnew
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

抱歉!评论已关闭.