Andriod中反射应用部分总结

五一过节写一篇简单一点的东西吧,这里就来简单总结下反射这个东东在android开发中的使用,当然这篇博客现在是不完全总结,知道多少写多少,以后应该还会进一步完善本篇博客。

这里先创建一个ReflectUtil类,这个类并不用来处理反射,而是提供一些实验数据

package com.yoryky.demo.util;

public class ReflectUtil {
    private String name = "yang";

    private void setName(String name){
        this.name = name;
    }

    private String getName(){
        return name;
    }

    public void showName(){
        System.out.println("ReflectUtil: name = " + name);
    }
}

接下来将利用反射对这个辅助类的私有属性以及私有方法进行操作。

1、操作私有属性和方法

这里直接贴出操作私有属性的代码

try {
    Class<?> class1 = Class.forName("com.yoryky.demo.util.ReflectUtil");
    Object object = class1.newInstance();
    ReflectUtil reflectUtil = (ReflectUtil) object;
    reflectUtil.showName();
    Field field = class1.getDeclaredField("name");
    field.setAccessible(true);//设置私有属性可访问
    field.set(object, "zheng");
    System.out.println("ReflectActivity testField name = " + field.get(object));

} catch (Exception e) {
    e.printStackTrace();
}

这里直接贴出操作私有方法的代码

try {
    Class<?> class1 = Class.forName("com.yoryky.demo.util.ReflectUtil");
    Object object = class1.newInstance();
    ReflectUtil reflectUtil = (ReflectUtil) object;
    reflectUtil.showName();//调用方法前的name值
    Method setName = class1.getDeclaredMethod("setName", String.class);//方法名以及参数
    setName.setAccessible(true);
    setName.invoke(object, "zheng");//调用setName方法
    Method getName = class1.getDeclaredMethod("getName");
    getName.setAccessible(true);
    System.out.println("ReflectActivity testFunction name = " + getName.invoke(object));

} catch (Exception e) {
    e.printStackTrace();
}

执行测试私有属性和私有方法后的代码后,控制台输出如下
这里写图片描述

由此可知通过对应反射代码,我们成功的操作了对应的私有属性和私有方法。

2、获取并操作复合控件的私有控件

这里我们在页面上添加一个android.support.v7.widget.SearchView的搜索控件,这是一个复合控件,由一些其它控件组成,其中包括输入搜索字符的SearchAutoComplete类型控件变量mSearchSrcTextView,这是一个私有属性的控件
这里写图片描述

但是如果我们想对其在代码中进行操作怎么办,比如我们想动态的设置它的字符,这里我们首先要获取mSearchSrcTextView这个变量,然后再对其进行操作。这里,我们页面上的SearchView实例化为svRflect

svReflect = (SearchView) findViewById(R.id.sv_reflect);

那么我们如果获取svReflect中对应的SearchAutoComplete类型控件变量mSearchSrcTextView呢?查看代码知道,SearchAutoComplete是EditView的子类,那么我们可以通过如下代码来获取和操作mSearchSrcTextView变量

try {
    Field field = SearchView.class.getDeclaredField("mSearchSrcTextView");
    field.setAccessible(true);
    EditText editText =  (EditText) field.get(svReflect);
    editText.setText("testing reflect");
} catch (Exception e) {
    e.printStackTrace();
}

这里写图片描述
这里我们获取到svRflect内部的mSearchSrcTextView变量,并对其进行了操作,在操作后SearchView控件对应的搜索字符被设置成了testing reflect。同理我们也可以通过类似方法对获取控件的私有方法的,这里就另外举例说明了。

好了,这篇文章就暂时总结到这里吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值