五一过节写一篇简单一点的东西吧,这里就来简单总结下反射这个东东在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。同理我们也可以通过类似方法对获取控件的私有方法的,这里就另外举例说明了。
好了,这篇文章就暂时总结到这里吧!