Android反射简单应用

获得或修改TelephonyManager状态

注意:这只是个例子,实际需要可能比这要复杂~

以下是两种方式的调用,注意反射要包裹在try/catch语句中并抛出异常。

 try {
            getInfo(1);//这里参数是1 因为原文件中 “NETWORK_TYPE_GPRS = 1”
            getField();
        } catch (Exception e) {
            e.printStackTrace();
        }

一、根据方法名字和参数来调用相应的值

**

 /**
     * 这个方法是重点,怎么用反射获取方法并运行方法
     * @param value
     * @return
     * @throws Exception
     */
    public void getInfo(int value) throws Exception {
        TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        // 首先获取一个Clas对象 几个对象是用来获取方法用的
        Class ownerClass = Class.forName("android.telephony.TelephonyManager");
        // Class ownerClass = mTelephonyManager.getClass();

        // 参数类型, 获取的方法说不定会有好多重载过的 可以通过参数来确认
        /**
         * 这个可以有好几个参数的形势 例如:Class[] argsClass = new Class[3]; argsClass[0] =
         * int.class; argsClass[1] = boolean.class; argsClass[0] = String.class;
         */
        Class[] argsClass = new Class[1];
        argsClass[0] = int.class;

        // 参数, 在方法运行的时候需要的参数
        /**
         * ====== 这个一定要 对应 要不然报错了 很难找 和argsClass 一一对应。
         */
        Object[] params = new Object[1];
        params[0] = value;

        // 获取参数 getNetworkTypeName 是你要获取的方法的名称 argsClass 是你方法的参数类型
        Method method = ownerClass.getMethod("getNetworkTypeName", argsClass);

        // 使用 method.invoke 来调用方法 mTelephonyManager 调用方法的对象 ,params 则就是参数
        Object result=method.invoke(mTelephonyManager, params);
          Log.i("jinjie","getNetworkTypeName== " + result);
    }

过程总结:

1、首先要找到类名,就是你要反射函数所在的类

2、找到方法,用getMethod(…)注意里边的参数

3、抛出反射invoke方法,得到返回值,进行必要的类型转化即可

二、通过实例化对象获得


/**
     * 额外添加一个获取属性值和一些其他的调用
     *
     * @return
     */
    private void getField() throws Exception{
        Class ownerClass = Class.forName("android.telephony.TelephonyManager");
        TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        //实例化一个对象
        /***Object instance = ownerClass.newInstance();**/

        // 我不清楚有没有隐藏 我现在解随便来一个
        Field field = ownerClass.getField("NETWORK_TYPE_GPRS");

        //  这个参数是我理解为是实例的对象
        int a =  (Integer) field.get(mTelephonyManager);

        // 下面是一个超级bug的东西
        // 怎么bug 呢 据说如果field是一个private我们是不可以调用的但是反射是可以的哦
        //由于是final类型的 我们先在这里注释掉哦
        /***field.set(mTelephonyManager, 2);**/

        Log.i("jinjie","NETWORK_TYPE_GPRS == " + a);


    }

过程总结:

1、首先要找到类名,就是你要反射函数所在的类

2、找到方法,用getField(…)注意里边的参数

3、field.get(一个实例化对象),再进行必要的类型转换

参考自:http://blog.csdn.net/y_haiyang/article/details/9924925

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值