您的位置:首页 > 移动开发 > Android开发

野人学Android第三弹——利用java的反射机制创建一个数据操作类

2016-01-14 23:52 633 查看
在android的教学视频中,知道“Bean”的存在,觉得挺有道理的,所以在Andorid的开发中,经常会运用到。但是在实际的开发中,数据结构Bean经常会修改,从而引发调用Bean的类的修改,引起连锁反应。最近在开发一款app的时候,涉及的Bean比较多,调整的工作量加大,秉着“好的程序猿都是懒人”的原则,研究了java的反射机制,创建了一个基于Bean的逻辑操作类,也就是说我不管你是什么Bean,都能用我的逻辑操作类进行数据形式的转换。想想还有点小激动,以后可以偷懒啦!哈哈哈~

言归正传,首先来简单介绍下我们的主角——Bean类。

public class GirlBean{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

Bean的存在,让对象的数据可以封装起来,符合Java的OOP思想。上面的代码中展示的是一个很简单的Gril的Bean类,在实际的开发中,会在很多地方使用到,比如说从数据表中调用gril类的数据,或者说从Server端传输Json格式的gril类数据。也就是说,只要app中的gril类数据,都会使用bean来封装。那么,问题就来了,随着需求的不断变化,GrilBean也会跟着变化,那么开发前期用到GrilBean类的程序中就会做相应的修改。如果你的app是一个比较庞大或者复杂的项目,那么需求的一丢丢修改,都会让你抓狂的。所以,自然而然地,我就想到有没有一种比较“懒”的方法能解决这个问题。
一、Bean功能的抽象

观察Bean类,主要的作用是封装了数据结构,并且使用setxxx和getxxx方法来对数据属性进行操作。也就是说Bean的最大作用是set或者get相应的属性,那么有没有可能独立于具体的bean类,直接用普遍的set和get方法来对Bean来操作呢?我想到的一个思路是,将具体的属性通过参数的形式传递给Bean类,这样一来就不受Bean的约束,可以创建一个接口,包含set()和get()两个方法接口。如下:

public interface Bean {
public  Object get(String key);
public  void set(String key ,Object value);
}


所有的Bean类都会继承这个接口类,那么必须要实现set()和get()方法。以GrilBean类为例,如下:

public class GirlBean implements Bean{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Object get(String classKey){
Object o =null;
switch (classKey) {
case "name":
o = this.getName();
break;
case "age":
o = this.getAge();
break;
default:
break;
}
return o;
}
public void set(String classKey, Object value){
switch (classKey) {
case "name":
this.setName((String)value);
break;
case "age":
this.setAge((int)value);
break;

default:
break;
}
}
}


这样一来的话,在使用GrilBean类的时候,我只需要使用set(key,value)或者get(key)的形式就能对GrilBean中的属性进行统一的操作。
二、利用反射机制获取Bean类的属性名称

如果能获取GrilBean的所有属性,那么就能用循环语句进行操作。这时候就要用到java的反射机制了(如果不了解java的反射机制,那请自行百度)。如下:

public class BeanModel<T> {
private Bean bean;

public BeanModel(Bean bean) {
super();
this.bean = bean;
}

public List<String> getName() {
List<String> list = new ArrayList<String>();
if (this.bean != null) {
Class<?> clz = this.bean.getClass();
Field[] fields = clz.getDeclaredFields();//通过反射获取类的属性,返回给一个数组

for (Field field : fields) {
// System.out.println(field.getName());
list.add(field.getName());//将类的属性名称添加到List集合中
}

}
return list;
}

}

通过以上的方法就能获取到任何Bean类的属性名称,想想是不是还有点小激动呢?!
三、小试牛刀,JSONArray转换成List

基于GrilBean的数据格式之间的转换,比如说JSONArray格式转换成List格式,就能用到以上的方法。如下代码添加到上面的BeanModel类:

public List<T> change(JSONArray json){
List<String> nList = this.getName();//获取Bean类的属性名称
List<T> list = new ArrayList<T>();
for (int i = 0; i < json.size(); i++) {
JSONObject jo = json.getJSONObject(i);
for (String s : nList) {
bean.set(s, jo.get(s));//设置bean的属性值
}
list.add((T) bean);
}
return list;
}


这样一来,不管你有多少Bean类,或者后期怎么修改Bean类的属性值,我都不用再去修改其他调用Bean类的文件。当然,如果有更好的思路,也可以跟我分享,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: